De retour en Fonction Récursive
J'ai juste commencé à apprendre le python (v3.2.3) et ont rencontré un étrange problème sur le return
dans cette fonction:
def test(x):
if x > 9 :
test(x - 10)
else:
print('real value',x)
return x
x = int(input())
y = test(x)
print('this should be real value',y)
Quand je le lance, j'obtiens:
45
real value 5
this should be real value None
Mais je m'y attendais:
45
real value 5
this should be real value 5
J'ai essayé d'ajouter return x
à l'extérieur de if
et j'ai obtenu la valeur entrée par défaut. Quelqu'un peut-il expliquer comment return
fonctionne?
- C'est exactement le même que pour un non-appel récursif: si vous voulez propager la valeur de retour de la fonction que vous avez appelé, vous avez à faire vous-même, avec la
return
mot-clé. L'appel d'une fonction produit de sa valeur de retour, mais c'est à vous de faire quelque chose avec cette valeur de retour, si la fonction appelée est récursive ou non.
Vous devez vous connecter pour publier un commentaire.
Vous appelez
test(45)
. Ce teste si45 > 9
, ce qui est vrai, de sorte qu'il invoquetest(35)
(45 - 10), sans revenir à son résultat. La même chose arrive avectest(25)
ettest(15)
, jusqu'à ce que finalementtest(5)
est invoquée.Ceci affiche la valeur réelle 5', puis renvoie 5. Mais le retour d'un résultat à partir d'une fonction toujours retourne à l'appelant de cette fonction. Il ne saute pas immédiatement au moyen de plusieurs appels; après tout, l'appelant peut vouloir faire quelque chose avec le résultat retourné avant de retourner quelque chose à c'est de l'appelant. Dans ce cas cependant, seulement
test(5)
renvoie rien du tout; tous les autres appelstest(x - 10)
, le temps pour le retour, ignorer ce qu'il fait retour, et alors (implicitement) de retourNone
. Depuis le ultrapériphériques invocationtest(45)
est l'un de ces cas, ce que vous obtenez estNone
.Voici une tentative de visualisation de ce qui se passe:
Vous n'avez pas d'appel
test(5)
dans l'interpréteur,test(5)
a été appelée à partir de l'intérieur d'un autre appel de fonction. De sorte que le retour detest(5)
va à cet appel de fonction,. Le fait que c'est un appel de fonction en elle-même est complètement hors de propos. Vous obtiendrez exactement les mêmes résultats si votre code ressemble à ceci:Le test(x) la fonction que vous appelez avec 'x=45' est la même que l'appel à la
test45(45)
. J'espère que vous pouvez voir pourquoi il est évident queNone
doivent être retournés lorsque la récursivité n'est pas impliqués. Eh bien, quand la récursivité est en cause, rien ne change. Lereturn
déclaration ne sait ni ne se soucie de savoir si c'est de retour d'un récursivement la fonction invoquée, il se comporte exactement de la même façon dans les deux cas.En fait, la récursivité n'est pas quelque chose de "spécial" à tous; il se comporte exactement de la même manière que d'ordinaire les appels de fonction. Vous recevez des informations de la chose qui vous a appelés par des arguments, et vous tout retour d'information vers la chose qui vous a appelés par retour. Si vous n'avez pas de retour de quelque chose (peut-être seulement dans un des bras d'un
if
), puisNone
sera retourné à votre appel, indépendamment de savoir si vous appelez de toute autre fonction dans cette branche, indépendamment de ce que la fonction peut retourner si vous ne vous appelez quelque chose, et quelle que soit la fonction que vous appelez se trouve être de la même fonction, vous êtes à l'intérieur.Le retour est en retrait de sorte qu'il s'exécute uniquement dans la branche else. Si la première branche est prise, la fonction renvoie implicitement Aucun.
Vous devez remplacer cette
y
est affectée la valeur de la première fonction d'appel seulement. Ce n'est pas quelque chose qui est unique à Python. La seule partie qui est unique pour Python, c'est que les fonctions implicitement retourNone
quand il n'y a pas d'instruction return.Vous avez oublié de retourner la valeur lorsque
x > 9
. Sans la valeur de retour, la fonction "retour"None
.test(x - 10)