Послідовність Фібоначчі - це та, яка підсумовує результат числа при додаванні до попереднього результату, починаючи з 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);
}
Перший, якщо statment перевіряє базовий випадок, де цикл може вирватися. Інакше, якщо твердження нижче, що робить те саме, але воно може бути переписане так ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Тепер, коли встановлено базовий випадок, ми повинні зрозуміти стек викликів. Ваш перший виклик до "Fliw" буде останнім, хто вирішить на стеку (послідовності викликів), оскільки вони вирішуються у зворотному порядку, з якого вони були викликані. Останній названий метод вирішується спочатку, потім останній, який слід викликати перед цим і так далі ...
Отже, усі дзвінки здійснюються спочатку, перш ніж все "підраховано" з цими результатами. При введенні 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;
}