web-dev-qa-db-fra.com

Comprendre la récursion avec la série de Fibonacci

J'essaie de mieux comprendre la récursivité et le fonctionnement des déclarations de retour. En tant que tel, je regarde un morceau de code destiné à identifier le numéro de fibonacci associé à un terme donné - dans ce cas, 4. J'ai du mal à comprendre la déclaration else.

def f(n):
  if n == 0:
    return 0
  if n == 1:
    return 1
  else:
    return f(n-1) + f(n-2)

f(4)

J'ai essayé d'utiliser Visualize Python pour examiner ce qui se passe à chaque étape, mais je me perds quand il atteint l'instruction else. 

On dirait qu’il faut prendre la valeur de n et soustraire 1 pour créer une nouvelle valeur n de 3 qu’il renvoie à la définition de la fonction. Donc, il semble ne renvoyer que la valeur de la première fonction de l'instruction else. Cependant, l'instruction else est écrite pour renvoyer la somme de 2 fonctions f(n-1) + f (n-2), auquel cas je pensais que la valeur de retour serait 5? Pouvez-vous même ajouter 2 fonctions ensemble?

Merci d'avance pour votre aide.

Voici un lien vers le code dans Visualize Python Somme de 2 fonctions

10
efw

L'ajout de quelques déclarations d'impression peut également aider à clarifier la séquence: 

def f(n):
    print("Number received:", n)
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        print("---- First recursion ----")
        a = f(n-1)
        print("---- Second recursion ----")
        b = f(n-2)
        print(" a=:",a,"; b=",b,"; returning:", a+b)
        return a + b

print("Final f(4)=", f(4))

Sortie:

Number received: 4
---- First recursion ----
Number received: 3
---- First recursion ----
Number received: 2
---- First recursion ----
Number received: 1
---- Second recursion ----
Number received: 0
 a=: 1 ; b= 0 ; returning: 1
---- Second recursion ----
Number received: 1
 a=: 1 ; b= 1 ; returning: 2
---- Second recursion ----
Number received: 2
---- First recursion ----
Number received: 1
---- Second recursion ----
Number received: 0
 a=: 1 ; b= 0 ; returning: 1
 a=: 2 ; b= 1 ; returning: 3
Final f(4)= 3
1
rnso