Una secuencia de Fibbonacci es una que suma el resultado de un número cuando se agrega al resultado anterior que comienza con 1.
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
Una vez que comprendamos qué es Fibbonacci, podemos comenzar a descomponer el 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);
}
El primero si la declaración comprueba un caso base, donde el bucle puede romperse. La otra declaración if a continuación está haciendo lo mismo, pero podría reescribirse así ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Ahora que se establece un caso base, tenemos que entender la pila de llamadas. Su primera llamada a "fibonacci" será la última en resolverse en la pila (secuencia de llamadas) a medida que se resuelven en el orden inverso desde el que fueron llamadas. El último método llamado se resuelve primero, luego el último llamado antes de ese y así sucesivamente ...
Por lo tanto, todas las llamadas se realizan primero antes de que algo se "calcule" con esos resultados. Con una entrada de 8, esperamos una salida de 21 (ver tabla anterior).
fibonacci (n - 1) se sigue llamando hasta que alcanza el caso base, luego se llama fibonacci (n - 2) hasta que alcanza el caso base. Cuando la pila comienza a sumar el resultado en orden inverso, el resultado será así ...
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).
Siguen burbujeando (resolviendo hacia atrás) hasta que se devuelve la suma correcta a la primera llamada en la pila y así es como obtienes tu respuesta.
Dicho esto, este algoritmo es muy ineficiente porque calcula el mismo resultado para cada rama en la que se divide el código. Un enfoque mucho mejor es uno "de abajo hacia arriba" donde no se requiere Memoization (almacenamiento en caché) o recursividad (stack de llamadas profundas).
Al igual que...
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;
}