Uma sequência de Fibbonacci é aquela que soma o resultado de um número quando adicionada ao resultado anterior, começando com 1.
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
Depois de entendermos o que é Fibbonacci, podemos começar a decompor o código.
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
A primeira, se a declaração procurar um caso base, onde o loop pode ocorrer. A declaração else if abaixo está fazendo o mesmo, mas pode ser reescrita dessa maneira ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Agora que um caso base é estabelecido, precisamos entender a pilha de chamadas. Sua primeira chamada para "fibonacci" será a última a ser resolvida na pilha (sequência de chamadas), conforme elas serão resolvidas na ordem inversa da qual foram chamadas. O último método chamado resolve primeiro, depois o último a ser chamado antes desse e assim por diante ...
Portanto, todas as chamadas são feitas primeiro antes que qualquer coisa seja "calculada" com esses resultados. Com uma entrada de 8, esperamos uma saída de 21 (veja a tabela acima).
fibonacci (n - 1) continua sendo chamado até atingir o caso base, então fibonacci (n - 2) é chamado até atingir o caso base. Quando a pilha começar a somar o resultado na ordem inversa, o resultado será mais ou menos assim ...
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).
Eles continuam borbulhando (resolvendo para trás) até que a soma correta seja retornada à primeira chamada na pilha e é assim que você obtém sua resposta.
Dito isto, esse algoritmo é muito ineficiente porque calcula o mesmo resultado para cada ramificação em que o código é dividido. Uma abordagem muito melhor é uma abordagem "de baixo para cima", em que não é necessária nenhuma memorização (cache) ou recursão (pilha profunda de chamadas).
Igual a...
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;
}