我正在編寫一個置換函數,它可以在Python中生成一個列表的所有排列組合。我的問題是,爲什麼這個工程: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],[])
但這並不:
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
這不工作,要麼(收率列表的副本):
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
這工作,但我仍然不知道爲什麼我需要添加收益的遞歸調用。 – 2010-08-05 05:40:27
考慮第一個函數調用和條件(如果len(outputSoFar)== len(inputData),或者不)。第一次調用將會失敗(除非輸入中只有一個元素),所以它不會產生任何結果。相反,它必須依靠遞歸調用來查找排列,當它們這樣做時,它們將產生它們。但是,當它們返回到第一個函數調用時,它必須讓它們回到原始調用方。 (每次遞歸,非基本情況下的調用都有類似的情況。)如果沒有這個,只有遞歸樹的葉子會產生任何東西。 – 2010-08-05 15:33:57