পাইথনে সর্বাধিক পুনরাবৃত্তির গভীরতা কত এবং কীভাবে এটি বাড়ানো যায়?


421

আমার এখানে এই পুচ্ছ পুনরাবৃত্তির কাজ রয়েছে:

def recursive_function(n, sum):
    if n < 1:
        return sum
    else:
        return recursive_function(n-1, sum+n)

c = 998
print(recursive_function(c, 0))

এটি পর্যন্ত কাজ করে n=997, তারপরে এটি কেবল ভেঙে যায় এবং এটিকে থুথু দেয় RecursionError: maximum recursion depth exceeded in comparison। এটি কি কেবল স্ট্যাকের ওভারফ্লো? এর আশপাশে যাওয়ার কি কোনও উপায় আছে?



9
স্মৃতিচারণ আপনার ফাংশনকে গতি বাড়িয়ে তুলতে পারে এবং স্ট্যাকের আকার বাড়ানোর পরিবর্তে পূর্ববর্তী গণনা করা মানগুলি টার্মিনেট করে এর কার্যকর পুনরাবৃত্তির গভীরতা বাড়িয়ে তুলতে পারে।
সাইওস

2
পুনরাবৃত্তির সীমাটি সাধারণত 1000
বরিস

1
@ টোনিক্স ইন্টারপ্রেটার একটি স্ট্যাক ফ্রেম যুক্ত করে ( line <n>, in <module>স্ট্যাক ট্রেসগুলিতে) এবং এই কোডটির জন্য 2 স্ট্যাক ফ্রেম লাগে n=1(কারণ বেস কেসটি n < 1তাই n=1এটি এখনও পুনরাবৃত্তি করে)। এবং আমি অনুমান করি যে পুনরাবৃত্তির সীমাটি অন্তর্ভুক্ত নয়, যেমন এটি "ত্রুটি আপনি যখন 1000 কে" আঘাত করেন তখন "নয়" ত্রুটি আপনি যদি 1000 (1001) ছাড়িয়ে যান "। 997 + 21000 এর চেয়ে কম তাই এটি কাজ 998 + 2করে না কারণ এটি সীমাটিকে হিট করে।
বোরিস

1
@ টোনিক্স নং recursive_function(997)কাজ করে, এটি বিরতি দেয় 998। আপনি যখন কল করেন তখন recursive_function(998)এটি 999 স্ট্যাক ফ্রেম ব্যবহার করে এবং দোভাষী দ্বারা 1 ফ্রেম যুক্ত করা হয় (কারণ আপনার কোডটি সর্বদা এটি শীর্ষ স্তরের মডিউলের অংশ হিসাবে চালিত হয়) যা এটি 1000 সীমাতে পৌঁছে দেয়।
বোরিস

উত্তর:


469

হ্যাঁ, এটি স্ট্যাকের ওভারফ্লো বিরুদ্ধে রক্ষী। পাইথন (বা বরং, সিপিথন বাস্তবায়ন) লেজ পুনরাবৃত্তি অনুকূলিত করে না, এবং নিরবিচ্ছিন্ন পুনরাবৃত্তি স্ট্যাকের ওভারফ্লোগুলি ঘটায়। আপনি এর সাথে পুনরাবৃত্তি সীমাটি পরীক্ষা করতে পারেন sys.getrecursionlimitএবং এর সাথে পুনরাবৃত্তির সীমাটি পরিবর্তন করতে sys.setrecursionlimitপারেন তবে এটি করা বিপজ্জনক - মান সীমাটি সামান্য রক্ষণশীল তবে পাইথন স্ট্যাকফ্রেমগুলি বেশ বড় হতে পারে।

পাইথন একটি কার্যকরী ভাষা নয় এবং লেজ পুনরাবৃত্তি একটি বিশেষ দক্ষ কৌশল নয়। অ্যালগরিদম পুনরাবৃত্তি পুনরাবৃত্তভাবে পুনঃলিখন, যদি সম্ভব হয় তবে সাধারণত একটি ভাল ধারণা।


4
আমার অভিজ্ঞতা থেকে, আপনাকে উভয় sysএবং resourceমডিউল উভয়ই সীমা বৃদ্ধি করতে হবে : stackoverflow.com/a/16248113/205521
টমাস আহলে

3
এটিকে পুনরাবৃত্ত সংস্করণে রূপান্তরিত করার কৌশল হিসাবে, একটি লেজ কল অপ্টিমাইজেশন ডেকরেটর ব্যবহার করা যেতে পারে
jfs

3
আপনি আপনার ওএসের উপরের সীমাটি জানতে svn.python.org/projects/python/trunk/Tools/scriptts/… ব্যবহার করতে পারেন
উল্ল্লু

8
উত্সটিতে আগ্রহীদের জন্য, ডিফল্ট পুনরাবৃত্তি সীমাটি 1000 hg.python.org/cpython/file/tip/Python/ceval.c#l691 এ সেট করা হয়েছে এবং hg.python.org/cpython এ API ব্যবহার করে এটি পরিবর্তন করা যেতে পারে /file/tip/Python/sysmodule.c#l643 যা পরিবর্তে hg.python.org/cpython/file/tip/Python/ceval.c#l703
প্রমোদ

16
টেল রিকার্সন এটির জন্য অনুকূলিত প্রোগ্রামিং ভাষার একটি সম্পূর্ণ দক্ষ কৌশল। সঠিক ধরণের সমস্যার জন্য, এটি একটি পুনরাবৃত্তিমূলক বাস্তবায়নটি আরও বেশি সংবেদনশীল হতে পারে। উত্তরটির অর্থ সম্ভবত "পাইথনে নির্দিষ্টভাবে" তবে এটি যা বলে তা নয়
পিটার আর

135

দেখে মনে হচ্ছে আপনার কেবল একটি উচ্চতর পুনরাবৃত্তির গভীরতা নির্ধারণ করতে হবে :

import sys
sys.setrecursionlimit(1500)

আমার ক্ষেত্রে আমি বেস কেসে রিটার্নের স্টেটমেন্টটি ভুলে গিয়েছিলাম এবং এটি 1000 এরও বেশি হয়ে গিয়েছিল Py পাইথন এই ব্যতিক্রমটি ছুঁড়তে শুরু করেছিল এবং আমি অবাক হয়ে গেলাম, কারণ আমি নিশ্চিত নই was স্ট্যাকের এটি চালানোর জন্য তৈরি করতে চলেছে।
বিজয়রাজ 34

sys.setrecursionlimit (50) বা একটি অল্প পরিমাণে কার্যকর যদি আপনার প্রোগ্রামটি পুনরাবৃত্তি করে and (আমার) খারাপ পুনরাবৃত্তির কোডটি ডিবাগ করার সময় আমি এটি খুব সহায়ক পেয়েছি।
পিউওয়ার্মসওয়ার্থ

56

এটি স্ট্যাকের অতিরিক্ত প্রবাহ এড়াতে to পাইথন ইন্টারপ্রেটার আপনাকে অসীম পুনরাবৃত্তিগুলি এড়াতে সহায়তা করার জন্য পুনরাবৃত্তির গভীরতা সীমাবদ্ধ করে, ফলস্বরূপ স্ট্যাক ওভারফ্লো। পুনরাবৃত্তি সীমা ( sys.setrecursionlimit) বাড়াতে বা পুনরাবৃত্তি না করে আপনার কোডটি পুনরায় লেখার চেষ্টা করুন।

থেকে পাইথন ডকুমেন্টেশন :

sys.getrecursionlimit()

পুনরাবৃত্তি সীমাটির বর্তমান মান, পাইথন ইন্টারপ্রেটার স্ট্যাকের সর্বাধিক গভীরতা ফিরিয়ে দিন। এই সীমাটি অসীম পুনরাবৃত্তিকে সি স্ট্যাকের একটি ওভারফ্লো এবং পাইথনকে ক্র্যাশ করতে বাধা দেয়। এটি দ্বারা সেট করা যেতে পারে setrecursionlimit()


আমার Anaconda দ্বারা x64, 3.5 পাইথন Windows এ উপর, ডিফল্ট সীমা 1000. হয়
Guillaume, Chevalier

30

আপনার যদি প্রায়শই পুনরাবৃত্তির সীমাটি পরিবর্তন করতে হয় (যেমন প্রোগ্রামিং ধাঁধাগুলি সমাধান করার সময়) আপনি একটি সাধারণ প্রসঙ্গ পরিচালককে এই জাতীয় সংজ্ঞা দিতে পারেন :

import sys

class recursionlimit:
    def __init__(self, limit):
        self.limit = limit
        self.old_limit = sys.getrecursionlimit()

    def __enter__(self):
        sys.setrecursionlimit(self.limit)

    def __exit__(self, type, value, tb):
        sys.setrecursionlimit(self.old_limit)

তারপরে একটি কাস্টম সীমা সহ কোনও ফাংশনকে কল করতে আপনি করতে পারেন:

with recursionlimit(1500):
    print(fib(1000, 0))

withবিবৃতিটির প্রধান অংশ থেকে প্রস্থান করার সময় পুনরাবৃত্তি সীমাটি ডিফল্ট মানটিতে পুনরুদ্ধার করা হবে।


আপনি প্রক্রিয়াটির সাথে পুনরাবৃত্তি সীমাটি আপ করতেresource চান । এটি ছাড়াই আপনি একটি সেগমেন্টেশন ফল্ট পাবেন এবং আপনি যদি setrecursionlimitখুব বেশি হন তবে পুরো পাইথন প্রক্রিয়াটি ক্র্যাশ হয়ে যাবে এবং নতুন সীমাটি ব্যবহার করার চেষ্টা করুন (প্রায় 8 মেগাবাইট স্ট্যাক ফ্রেমগুলি, যা উপরের সাধারণ ফাংশনটির সাথে ~ 30,000 স্ট্যাক ফ্রেমগুলিতে অনুবাদ করে) আমার ল্যাপটপ).
বোরিস

16

এমন একটি ভাষা ব্যবহার করুন যা টেল-কল অপ্টিমাইজেশনের গ্যারান্টি দেয়। বা পুনরাবৃত্তি ব্যবহার করুন। বিকল্পভাবে, সাজসজ্জা সঙ্গে সুন্দর পেতে ।


36
এটি বরং স্নানের জল দিয়ে বাচ্চাকে বাইরে ফেলে দিচ্ছে।
রাসেল বোরোগোভ

3
@ রাসেল: আমি যে বিকল্পগুলির প্রস্তাব দিয়েছি তার মধ্যে একটিই এটির পরামর্শ দেয়।
মার্সেলো ক্যান্টোস

"সাজসজ্জার দিয়ে সুন্দর করুন" ঠিক কোনও বিকল্প নয়।
মিঃ বি

@ বিএনপিতে ফিরছেন বি, যদি না আপনি বেশী প্রয়োজন ulimit -sস্ট্যাক ফ্রেমের, হ্যাঁ এটা stackoverflow.com/a/50120316
বরিস

14

resource.setrlimit স্ট্যাকের আকার বাড়াতে এবং সেগফোল্ট প্রতিরোধ করতে অবশ্যই ব্যবহার করা উচিত

লিনাক্স কার্নেল প্রক্রিয়াগুলির স্ট্যাককে সীমাবদ্ধ করে

পাইথন অনুবাদকারীদের স্ট্যাকের উপর স্থানীয় ভেরিয়েবল সংরক্ষণ করে এবং তাই পুনরাবৃত্তি দোভাষীর স্ট্যাক স্থান গ্রহণ করে।

পাইথন ইন্টারপ্রেটার যদি স্ট্যাকের সীমাটি ছাড়িয়ে যাওয়ার চেষ্টা করে তবে লিনাক্স কার্নেল এটিকে পৃথককরণের ত্রুটি করে তোলে।

স্ট্যাক সীমা আকার getrlimitএবং setrlimitসিস্টেম কলগুলির সাথে নিয়ন্ত্রিত হয় ।

পাইথন resourceমডিউলটির মাধ্যমে সেই সিস্টেম কলগুলিতে অ্যাক্সেসের প্রস্তাব দেয় ।

import resource
import sys

print resource.getrlimit(resource.RLIMIT_STACK)
print sys.getrecursionlimit()
print

# Will segfault without this line.
resource.setrlimit(resource.RLIMIT_STACK, [0x10000000, resource.RLIM_INFINITY])
sys.setrecursionlimit(0x100000)

def f(i):
    print i
    sys.stdout.flush()
    f(i + 1)
f(0)

অবশ্যই, আপনি যদি ওলিমিটকে বাড়িয়ে তুলতে থাকেন তবে আপনার র‍্যামটি ফুরিয়ে যাবে, যা হয় অদলবদলের কারণে আপনার কম্পিউটারকে থামিয়ে দেয় বা ওওম কিলারের মাধ্যমে পাইথনকে মেরে ফেলবে।

বাশ থেকে, আপনি স্ট্যাক সীমাটি (কেবিতে) এর সাথে দেখতে এবং সেট করতে পারেন:

ulimit -s
ulimit -s 10000

আমার জন্য ডিফল্ট মান 8Mb।

আরো দেখুন:

উবুন্টু 16.10, পাইথন 2.7.12 এ পরীক্ষিত।


1
স্ট্যাক ক্ল্যাশ প্রতিকারের rlimit_stackপরে সেট করার চেষ্টা করার ফলে ব্যর্থতা বা সম্পর্কিত সমস্যা হতে পারে। এছাড়াও রেড হ্যাট ইস্যু 1463241
jww

আমি এই (পাইথন রিসোর্স পার্ট) ব্যবহার করে প্রফেসর টিম রুফগার্ডেনের গড় (বিশাল) ডেটাসেটে আমার কোসারাজুর অ্যালগরিদম বাস্তবায়নে সহায়তা করেছিলাম। আমার বাস্তবায়ন ছোট সেটগুলিতে কাজ করেছে, অবশ্যই একটি বড় ডেটাসেটের সাথে সমস্যাটি পুনরাবৃত্তি / স্ট্যাক সীমা ছিল ... নাকি এটি ছিল? হ্যাঁ, হ্যাঁ! ধন্যবাদ!
নীলো

9

আমি বুঝতে পেরেছি এটি একটি পুরানো প্রশ্ন তবে যারা পড়ার জন্য, আমি এই জাতীয় সমস্যার জন্য পুনরাবৃত্তি ব্যবহারের বিরুদ্ধে সুপারিশ করব - তালিকাগুলি আরও দ্রুত এবং পুরোপুরি পুনরাবৃত্তি এড়াতে। আমি এটি প্রয়োগ করব:

def fibonacci(n):
    f = [0,1,1]
    for i in xrange(3,n):
        f.append(f[i-1] + f[i-2])
    return 'The %.0fth fibonacci number is: %.0f' % (n,f[-1])

(আপনি যদি 1 এর পরিবর্তে 0 থেকে আপনার ফিবোনাচি ক্রমটি গণনা শুরু করেন তবে এক্সরেঞ্জে n + 1 ব্যবহার করুন)


13
আপনি যখন ও (1) ব্যবহার করতে পারেন তখন কেন ও (এন) স্পেসটি ব্যবহার করবেন?
জানুস ট্রয়লসন

11
কেবলমাত্র ও (এন) স্থান মন্তব্য বিভ্রান্তিকর ক্ষেত্রে: একটি তালিকা ব্যবহার করবেন না। তালিকাটি সমস্ত মান রাখবে যখন আপনার প্রয়োজন সমস্ত হ'ল নবম মান। একটি সাধারণ অ্যালগরিদম হ'ল শেষ দুটি ফিবোনাচি নম্বরগুলি রাখা এবং যতক্ষণ না আপনি নিজের প্রয়োজনটির সাথে না পৌঁছাবেন সেগুলি যুক্ত করুন। আরও ভাল অ্যালগরিদম আছে।
মিলিমেট্রিক

3
@ ম্যাথাইম: পাইথন 3 এ xrangeকেবল বলা হয়range
এরিক ও লেবিগোট

1
@ ইওএল আমি এটি সম্পর্কে অবগত
রয়েছি

7
@ ম্যাথাইম আমি এই মন্তব্যগুলি পড়ার জন্য বিষয়গুলি স্পষ্ট করে দিচ্ছিলাম।
এরিক হে লেবিগোট

9

অবশ্যই ফিনোনাচি সংখ্যাগুলি বিন (সূত্র) প্রয়োগ করে ও (এন) তে গণনা করা যেতে পারে:

from math import floor, sqrt

def fib(n):                                                     
    return int(floor(((1+sqrt(5))**n-(1-sqrt(5))**n)/(2**n*sqrt(5))+0.5))

মন্তব্যকারীরা মনে রাখবেন যে এটি ও (1) নয় তবে ও (এন) এর কারণে 2**n। এছাড়াও একটি পার্থক্য হ'ল আপনি কেবল একটি মান পান যখন পুনরাবৃত্তির সাথে Fibonacci(n)আপনি সেই মান পর্যন্ত সমস্ত মান পাবেন ।


8
অজগরটিতে দীর্ঘতম আকারের আর কোনও আকার নেই।
পিপ্পারি

8
এটি লক্ষণীয় যে nভাসমান পয়েন্ট অবজ্ঞানের কারণে এটি বৃহত্তর জন্য ব্যর্থ হয় - এর মধ্যে পার্থক্য (1+sqrt(5))**nএবং (1+sqrt(5))**(n+1)1 টি কম এর চেয়ে কম হয়ে যায়, তাই আপনি ভুল ফলাফল পেতে শুরু করেন।


@ মেগো কি? এটির মধ্যে পার্থক্য (1+sqrt(5))**nএবং ((1+sqrt(5))**n)+1এটি 1 টিও কম হয়! (ছোট টাইপো) এছাড়াও, {@} rwst এটি ও (1) নয়! গণনা করা হচ্ছে 2**nকমপক্ষে হে (ঢ) সময় লাগে।
ব্যবহারকারী 202729

3
@ ব্যবহারকারী202729 এটি সত্য নয়, গণনা 2**nকার্যকরভাবে হে (লগ (এন)) দ্বারা স্কোয়ারিংয়ের মাধ্যমে এক্সপেনসিটিশন ব্যবহার করে
স্যাম

6

"সর্বোচ্চ পুনরাবৃত্তির গভীরতা ছাড়িয়ে গেছে" ত্রুটির সাথে আমার একই সমস্যা ছিল। আমি আবিষ্কার করেছি যে আমি যে ডিরেক্টরিটি লুপ করছি তার একটি দুর্নীতিগ্রস্থ ফাইল দ্বারা ত্রুটিটি ট্রিগার করা হচ্ছে os.walk। যদি আপনার সমস্যাটি সমাধান করতে সমস্যা হয় এবং আপনি ফাইল পাথ নিয়ে কাজ করছেন তবে এটিকে সঙ্কুচিত করার বিষয়ে নিশ্চিত হন, কারণ এটি কোনও দূষিত ফাইল হতে পারে।


2
ওপি তার কোড দেয় এবং তার পরীক্ষাটি ইচ্ছামতো পুনরুত্পাদনযোগ্য। এটি দুর্নীতিগ্রস্ত ফাইল জড়িত না।
টি। ভেরন

5
আপনি ঠিক বলেছেন, তবে আমার উত্তরটি ওপি-র দিকে কমার নয়, যেহেতু এটি চার বছর আগে ছিল। আমার উত্তরটি এমআরডি ত্রুটিযুক্ত ব্যক্তিদের পরোক্ষভাবে দুর্নীতিগ্রস্থ ফাইলগুলির দ্বারা সৃষ্টদের সহায়তা করার উদ্দেশ্যে - যেহেতু এটি প্রথম অনুসন্ধানের ফলাফলগুলির মধ্যে একটি। এটি কাউকে সহায়তা করেছে, যেহেতু এটি ভোট দেওয়া হয়েছে। ডাউন ভোটের জন্য ধন্যবাদ
টাইলার

2
আমার সমস্যাটি অনুসন্ধান করার সময় এটিই কেবলমাত্র আমি খুঁজে পেয়েছি যা একটি "সর্বাধিক পুনরাবৃত্তির গভীরতা" সংযুক্ত ফাইলের সাথে সংযুক্ত করে। ধন্যবাদ!
জেফ

5

আপনি যদি কেবল কয়েকটি ফিবোনাচি নম্বর পেতে চান তবে আপনি ম্যাট্রিক্স পদ্ধতিটি ব্যবহার করতে পারেন।

from numpy import matrix

def fib(n):
    return (matrix('0 1; 1 1', dtype='object') ** n).item(1)

এটি নপী দ্রুত ক্ষতিকারক অ্যালগরিদম ব্যবহার করায় এটি দ্রুত। আপনি ও (লগ এন) এ উত্তর পাবেন। এবং এটি বিনেটের সূত্রের চেয়ে ভাল কারণ এটি কেবল পূর্ণসংখ্যা ব্যবহার করে। তবে আপনি যদি সমস্ত ফিবোনাচি সংখ্যা এন পর্যন্ত চান তবে এটি মুখস্ত করেই করা ভাল।


দুর্ভাগ্যক্রমে আপনি বেশিরভাগ প্রতিযোগিতামূলক প্রোগ্রামিং বিচারকদের মধ্যে আড়ষ্ট ব্যবহার করতে পারবেন না। তবে হ্যাঁ স্যার, আপনার সমাধানটি আমার প্রিয়। আমি কিছু সমস্যার জন্য ম্যাট্রিক্স সলিউশন ব্যবহার করেছি। এটি সবচেয়ে ভাল সমাধান যখন আপনার খুব বড় ফিবোনাচি নম্বর প্রয়োজন এবং আপনি একটি মডুলাস ব্যবহার করতে পারবেন না। যদি আপনাকে কোনও মডুলাস ব্যবহার করার অনুমতি দেওয়া হয় তবে পিসানো সময়কাল এটি করার আরও ভাল উপায়।
mentatkgs

4

জেনারেটর ব্যবহার করবেন?

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fibs = fib() #seems to be the only way to get the following line to work is to
             #assign the infinite generator to a variable

f = [fibs.next() for x in xrange(1001)]

for num in f:
        print num

উপরের fib () ফাংশনটি: http://interediapythonista.com/python-generators থেকে অভিযোজিত


1
কোনও ভেরিয়েবলের জন্য একটি জেনারেটর নির্ধারণের কারণ হ'ল [fibs().next() for ...]প্রতিটি সময় নতুন জেনারেটর তৈরি করা।
tox123

3

@ অ্যালেক্সের পরামর্শ অনুসারে আপনি পুনরাবৃত্তির পরিবর্তে ক্রমানুসারে এটি করার জন্য একটি জেনারেটর ফাংশন ব্যবহার করতে পারেন ।

আপনার প্রশ্নের কোডটির সমতুল্য এখানে:

def fib(n):
    def fibseq(n):
        """ Iteratively return the first n Fibonacci numbers, starting from 0. """
        a, b = 0, 1
        for _ in xrange(n):
            yield a
            a, b = b, a + b

    return sum(v for v in fibseq(n))

print format(fib(100000), ',d')  # -> no recursion depth error

2

অনেকে সুপারিশ করেন যে পুনরাবৃত্তি সীমা বৃদ্ধি করা একটি ভাল সমাধান তবে এটি সর্বদা সীমাবদ্ধ থাকায় তা নয়। পরিবর্তে একটি পুনরাবৃত্তি সমাধান ব্যবহার করুন।

def fib(n):
    a,b = 1,1
    for i in range(n-1):
        a,b = b,a+b
    return a
print fib(5)

1

ফিবোনাচি গণনা করতে স্মৃতিচারণ ব্যবহার করার জন্য আমি একটি উদাহরণ দিতে চেয়েছিলাম কারণ এটি আপনাকে পুনরাবৃত্তির সাহায্যে উল্লেখযোগ্য পরিমাণে সংখ্যা গণনা করতে দেবে:

cache = {}
def fib_dp(n):
    if n in cache:
        return cache[n]
    if n == 0: return 0
    elif n == 1: return 1
    else:
        value = fib_dp(n-1) + fib_dp(n-2)
    cache[n] = value
    return value

print(fib_dp(998))

এটি এখনও পুনরাবৃত্তিমূলক, তবে একটি সাধারণ হ্যাশ টেবিল ব্যবহার করে যা পূর্বে গণনা করা ফিবোনাচি সংখ্যাগুলি আবার না করে পুনরায় ব্যবহারের অনুমতি দেয়।


1
import sys
sys.setrecursionlimit(1500)

def fib(n, sum):
    if n < 1:
        return sum
    else:
        return fib(n-1, sum+n)

c = 998
print(fib(c, 0))

1
এই একই উত্তর অনেকবার দেওয়া হয়েছে। দয়া করে এটি সরান।
ZF007

0

আমরা @lru_cacheডেকোরেটার এবং setrecursionlimit()পদ্ধতি ব্যবহার করে এটি করতে পারি :

import sys
from functools import lru_cache

sys.setrecursionlimit(15000)


@lru_cache(128)
def fib(n: int) -> int:
    if n == 0:
        return 0
    if n == 1:
        return 1

    return fib(n - 2) + fib(n - 1)


print(fib(14000))

আউটপুট

3002468761178461090995494179715025648692747937490792943468375429502230242942284835863402333575216217865811638730389352239181342307756720414619391217798542575996541081060501905302157019002614964717310808809478675602711440361241500732699145834377856326394037071666274321657305320804055307021019793251762830816701587386994888032362232198219843549865275880699612359275125243457132496772854886508703396643365042454333009802006384286859581649296390803003232654898464561589234445139863242606285711591746222880807391057211912655818499798720987302540712067959840802106849776547522247429904618357394771725653253559346195282601285019169360207355179223814857106405285007997547692546378757062999581657867188420995770650565521377874333085963123444258953052751461206977615079511435862879678439081175536265576977106865074099512897235100538241196445815568291377846656352979228098911566675956525644182645608178603837172227838896725425605719942300037650526231486881066037397866942013838296769284745527778439272995067231492069369130289154753132313883294398593507873555667211005422003204156154859031529462152953119957597195735953686798871131148255050140450845034240095305094449911578598539658855704158240221809528010179414493499583473568873253067921639513996596738275817909624857593693291980841303291145613566466575233283651420134915764961372875933822262953420444548349180436583183291944875599477240814774580187144637965487250578134990402443365677985388481961492444981994523034245619781853365476552719460960795929666883665704293897310201276011658074359194189359660792496027472226428571547971602259808697441435358578480589837766911684200275636889192254762678512597000452676191374475932796663842865744658264924913771676415404179920096074751516422872997665425047457428327276230059296132722787915300105002019006293320082955378715908263653377755031155794063450515731009402407584683132870206376994025920790298591144213659942668622062191441346200098342943955169522532574271644954360217472458521489671859465232568419404182043966092211744372699797375966048010775453444600153524772238401414789562651410289808994960533132759532092895779406940925252906166612153699850759933762897947175972147868784008320247586210378556711332739463277940255289047962323306946068381887446046387745247925675240182981190836264964640612069909458682443392729946084099312047752966806439331403663934969942958022237945205992581178803606156982034385347182766573351768749665172549908638337611953199808161937885366709285043276595726484068138091188914698151703122773726725261370542355162118164302728812259192476428938730724109825922331973256105091200551566581350508061922762910078528219869913214146575557249199263634241165352226570749618907050553115468306669184485910269806225894530809823102279231750061652042560772530576713148647858705369649642907780603247428680176236527220826640665659902650188140474762163503557640566711903907798932853656216227739411210513756695569391593763704981001125

সূত্র

ফান্টুলগুলি lru_cache


0

আমরা গতিশীল প্রোগ্রামিং ডাউন আপ পদ্ধতির বিভিন্নতাও ব্যবহার করতে পারি

def fib_bottom_up(n):

    bottom_up = [None] * (n+1)
    bottom_up[0] = 1
    bottom_up[1] = 1

    for i in range(2, n+1):
        bottom_up[i] = bottom_up[i-1] + bottom_up[i-2]

    return bottom_up[n]

print(fib_bottom_up(20000))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.