एक Fibbonacci अनुक्रम वह संख्या है जो किसी संख्या के परिणाम को तब जोड़ती है जब पिछले परिणाम को 1 से शुरू किया जाता है।
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
एक बार जब हम समझते हैं कि फाइबोनकेशिया क्या है, तो हम कोड को तोड़ना शुरू कर सकते हैं।
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
यदि आधार बेस केस के लिए स्टेटमेंट चेक करता है तो पहला, जहां लूप टूट सकता है। और अगर नीचे दिया गया कथन समान है, लेकिन ऐसा फिर से लिखा जा सकता है ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
अब जब एक आधार मामला स्थापित हो गया है तो हमें कॉल स्टैक को समझना होगा। आपका पहला कॉल "रिट्रेसमेंट" स्टैक (कॉल का अनुक्रम) पर हल करने के लिए अंतिम होगा क्योंकि वे रिवर्स ऑर्डर में हल करते हैं जिसमें से उन्हें बुलाया गया था। अंतिम विधि को पहले हल किया जाता है, फिर आखिरी को उस से पहले बुलाया जाता है ...
इसलिए, उन परिणामों के साथ कुछ भी "गणना" करने से पहले सभी कॉल पहले किए जाते हैं। 8 के इनपुट के साथ हम 21 के आउटपुट की उम्मीद करते हैं (ऊपर दी गई तालिका देखें)।
रिट्रेसमेंट (n - 1) को तब तक बुलाया जाता है जब तक कि यह बेस केस तक नहीं पहुंच जाता है, तब बेस केस तक पहुंचने तक रिट्रेसमेंट (n - 2) कहा जाता है। जब स्टैक परिणाम को रिवर्स ऑर्डर में समेटना शुरू करता है, तो परिणाम ऐसा होगा ...
1 + 1 = 1 ---- last call of the stack (hits a base case).
2 + 1 = 3 ---- Next level of the stack (resolving backwards).
2 + 3 = 5 ---- Next level of the stack (continuing to resolve).
वे तब तक बुदबुदाते रहते हैं (पीछे की ओर बढ़ते हुए) जब तक कि सही राशि स्टैक में पहली कॉल पर वापस नहीं आ जाती है और इस तरह से आपको अपना उत्तर मिल जाता है।
यह कहते हुए कि, यह एल्गोरिथ्म बहुत अक्षम है क्योंकि यह प्रत्येक शाखा के लिए समान परिणाम की गणना करता है जिसमें कोड विभाजित होता है। बहुत बेहतर दृष्टिकोण एक "बॉटम अप" है जहां कोई मेमोइज़ेशन (कैशिंग) या पुनरावृत्ति (गहरी कॉल स्टैक) की आवश्यकता नहीं है।
इस तरह...
static int BottomUpFib(int current)
{
if (current < 2) return current;
int fib = 1;
int last = 1;
for (int i = 2; i < current; i++)
{
int temp = fib;
fib += last;
last = temp;
}
return fib;
}