Il y a beaucoup de bonnes réponses ici, mais j'ai fait ce diagramme qui aide à mieux expliquer le résultat de la fonction. Les seules valeurs qui seront retournées sont 1 ou 0 (votre exemple retourne 1 pour n < 2, mais devrait plutôt retourner n).
Cela signifie que chaque appel récursif finira par retourner un 0 ou un 1. Ceux-ci finissent par être "mis en cache" dans la pile et "reportés" dans l'invocation originale et additionnés.
Ainsi, si vous deviez dessiner ce même diagramme pour chaque valeur de "n", vous pourriez trouver la réponse manuellement.
Ce diagramme illustre grossièrement comment chaque fonction est retournée pour fib(5).
Cela montre le flux de contrôle, c'est-à-dire l'ordre d'exécution des fonctions. Rappelez-vous que le code est toujours exécuté de gauche à droite et de haut en bas. Ainsi, chaque fois qu'une nouvelle fonction est appelée, elle est mise en pause, puis l'invocation suivante a lieu.
Ce qui suit illustre le flux de contrôle réel basé sur votre message original. Veuillez noter que la condition de base est if (n <= 0) {return 0} else if (n <= 2) {return 1;}
par souci de simplification :
1. fib(5) {
return fib(4) + fib(3);
2. fib(4) {
return fib(3) + fib(2);
3. fib(3) {
return fib(2) + fib(1);
4. fib(2) {
A= return 1;
};
5. fib(1) {
B= return 1;
};
C= return 2; // (1 + 1)
};
6. fib(2) {
D= return 1;
};
E= return 3; // (2 + 1)
};
7. fib(3) {
return fib(2) + fib(1);
8. fib(2) {
F= return 1;
};
9. fib(1) {
G= return 1;
};
H= return 2; // (1 + 1)
};
I= return 5; // (3 + 2)
};