Python置换生成器之谜
我正在编写一个置换函数,用Python生成列表的所有置换。我的问题是为什么这样做有效:Python置换生成器之谜,python,recursion,generator,puzzle,permutation,Python,Recursion,Generator,Puzzle,Permutation,我正在编写一个置换函数,用Python生成列表的所有置换。我的问题是为什么这样做有效: def permute(inputData, outputSoFar): for elem in inputData: if elem not in outputSoFar: outputSoFar.append(elem) if len(outputSoFar) == len(inputData): pr
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
这也不起作用(生成列表的副本):
当你做pop的时候,你正在毁灭性地丢失物品。使用列表的副本,而不是对其进行适当的修改
或者,使用
itertools.permutations
或itertools.compositions
。当您执行pop时,您会破坏性地丢失项目。使用列表的副本,而不是对其进行适当的修改
或者,使用
itertools.permutations
或itertools.compositions
。您还必须生成递归调用的结果:
。。。或(更接近操作代码):
您还必须生成递归调用的结果: 。。。或(更接近操作代码):
我知道itertools.permutation。然而,这个谜题的目的是学习python生成器/递归。我知道itertools.permutation。然而,这个难题的目的是了解Python生成器/递归。这是可行的,但我仍然不知道为什么我需要增加递归调用的收益率。考虑第一个函数调用和条件(如果LeN(OutPutsOar)== LeN(InDeDATA),或不)。第一次调用将使条件失败(除非输入中只有一个元素),因此它不会产生任何结果。相反,它必须依赖递归调用来查找置换,当它们这样做时,它们将产生置换。但是,当它们返回给第一个函数调用时,它必须将它们返回给原始调用方。(每一个递归的、非基础的情况调用都是在类似的情况下)。没有这个,只有递归树的叶子会产生任何东西。这是可行的,但是我仍然不知道为什么我需要增加递归调用的收益率。考虑第一个函数调用和条件(如果是LeN(OutPoStAR)==LEN(输入数据))。第一次调用将使条件失败(除非输入中只有一个元素),因此它不会产生任何结果。相反,它必须依赖递归调用来查找置换,当它们这样做时,它们将产生置换。但是,当它们返回给第一个函数调用时,它必须将它们返回给原始调用方。(每个递归的、非基本情况的调用都处于类似的情况。)如果没有这一点,只有递归树的叶子才能产生任何结果。
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
def permute(inputData, outputSoFar):
for a in inputData:
if a not in outputSoFar:
if len(outputSoFar) == len(inputData) - 1:
yield outputSoFar + [a]
else:
for b in permute(inputData, outputSoFar + [a]): # --- Recursion
yield b
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
else:
for permutation in permute(inputData, outputSoFar):
yield permutation # --- Recursion
outputSoFar.pop()
for i in permute([1,2,3], []):
print i