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

我正在编写一个置换函数,用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
这也不起作用(生成列表的副本):


当你做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