একটি ফিবোনাচি সিকোয়েন্স হ'ল 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 এর আউটপুট আশা করি (উপরের টেবিলটি দেখুন)।
ফাইবোনাকি (এন - 1) বেস কেস না পৌঁছানো অবধি কল করা থাকে, তারপরে এটি বেস কেসে না পৌঁছানো পর্যন্ত ফাইবোনাকি (এন - 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;
}