Une séquence de Fibbonacci est celle qui additionne le résultat d'un nombre lorsqu'elle est ajoutée au résultat précédent en commençant par 1.
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
Une fois que nous comprenons ce qu'est Fibbonacci, nous pouvons commencer à décomposer le code.
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
La première instruction if vérifie un cas de base, où la boucle peut éclater. L'instruction else if ci-dessous fait la même chose, mais elle pourrait être réécrite comme ça ...
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Maintenant qu'un cas de base est établi, nous devons comprendre la pile d'appels. Votre premier appel à "fibonacci" sera le dernier à résoudre sur la pile (séquence d'appels) car ils résolvent dans l'ordre inverse à partir duquel ils ont été appelés. La dernière méthode appelée résout en premier, puis la dernière à être appelée avant celle-là et ainsi de suite ...
Ainsi, tous les appels sont effectués en premier avant que quoi que ce soit ne soit "calculé" avec ces résultats. Avec une entrée de 8, nous attendons une sortie de 21 (voir tableau ci-dessus).
fibonacci (n - 1) continue d'être appelé jusqu'à ce qu'il atteigne le cas de base, puis fibonacci (n - 2) est appelé jusqu'à ce qu'il atteigne le cas de base. Lorsque la pile commence à additionner le résultat dans l'ordre inverse, le résultat sera comme ceci ...
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).
Ils continuent à bouillonner (se résolvent à l'envers) jusqu'à ce que la somme correcte soit retournée au premier appel de la pile et c'est ainsi que vous obtenez votre réponse.
Cela dit, cet algorithme est très inefficace car il calcule le même résultat pour chaque branche dans laquelle le code se divise. Une bien meilleure approche est une approche «ascendante» où aucune mémorisation (mise en cache) ou récursivité (pile d'appels en profondeur) n'est requise.
Ainsi...
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;
}