Последовательность Фиббоначи - это последовательность, которая суммирует результат числа при добавлении к предыдущему результату, начинающемуся с 1.
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
Как только мы поймем, что такое Fibbonacci, мы можем начать разбивать код.
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
Первый if statment проверяет базовый случай, где цикл может разорваться. Оператор else if ниже делает то же самое, но его можно переписать так ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Теперь, когда базовый случай установлен, мы должны понять стек вызовов. Ваш первый вызов «fibonacci» будет последним, который разрешит стек (последовательность вызовов), поскольку они разрешаются в обратном порядке, из которого они были вызваны. Сначала вызывается последний вызываемый метод, затем последний, вызываемый перед этим, и так далее ...
Таким образом, все вызовы выполняются в первую очередь, прежде чем что-либо «рассчитывается» с этими результатами. При вводе 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).
Они продолжают пузыриться (разрешаться в обратном направлении) до тех пор, пока правильная сумма не будет возвращена первому вызову в стеке, и вот как вы получите свой ответ.
Сказав это, этот алгоритм очень неэффективен, потому что он вычисляет один и тот же результат для каждой ветви, на которую разбивается код. Гораздо лучший подход - это подход «снизу вверх», где не требуется Memoization (кэширование) или рекурсия (глубокий стек вызовов).
Вот так...
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;
}