J'écris une fonction de permutation qui génère toutes les permutations d'une liste en Python. Ma question est pourquoi cela fonctionne:Puzzle du générateur de permutation Python
def permute(inputData, outputSoFar):
for elem in inputData:
if elem not in outputSoFar:
outputSoFar.append(elem)
if len(outputSoFar) == len(inputData):
print outputSoFar
else:
permute(inputData, outputSoFar) # --- Recursion
outputSoFar.pop()
permute([1,2,3],[])
Mais cela ne:
def permute(inputData, outputSoFar):
for elem in inputData:
if elem not in outputSoFar:
outputSoFar.append(elem)
if len(outputSoFar) == len(inputData):
yield outputSoFar
else:
permute(inputData, outputSoFar) # --- Recursion
outputSoFar.pop()
for i in permute([1,2,3], []):
print i
Cela ne fonctionne pas non plus (obtenir une copie de la liste):
def permute(inputData, outputSoFar):
for elem in inputData:
if elem not in outputSoFar:
outputSoFar.append(elem)
if len(outputSoFar) == len(inputData):
yield outputSoFar[:] # --- Copy of the list
else:
permute(inputData, outputSoFar) # --- Recursion
outputSoFar.pop()
for i in permute([1,2,3], []):
print i
Cela fonctionne mais je ne sais toujours pas pourquoi j'ai besoin d'ajouter le rendement à l'appel récursif. –
Considérons le premier appel de fonction et la condition (si len (outputSoFar) == len (inputData), ou pas). Le premier appel échouera à la condition (à moins qu'il n'y ait qu'un seul élément dans l'entrée), donc il ne donnera rien. Au lieu de cela, il doit s'appuyer sur des appels récursifs pour trouver des permutations, et quand ils le font, ils vont les céder. Cependant, lorsqu'ils sont restitués à cet appel de première fonction, ils doivent les restituer à l'appelant d'origine. (Chaque appel récursif, non-base-cas est dans une situation similaire.) Sans cela, seules les feuilles de l'arbre de récursion donneront n'importe quoi. –