python中递归函数的累积结果

python中递归函数的累积结果,python,recursion,Python,Recursion,考虑使用以下函数在列表中排列数字: def permute(numbers, N=0): # base case if N == len(numbers): print numbers return for i in range(len(numbers)-N): # swapping relevant elements element=numbers.pop(N+i) numbers.in

考虑使用以下函数在列表中排列数字:

def permute(numbers, N=0):
    # base case
    if N == len(numbers):
        print numbers
        return

    for i in range(len(numbers)-N):

        # swapping relevant elements
        element=numbers.pop(N+i)
        numbers.insert(N,element)

        # recursive call
        permute(numbers, N+1)

        # swapping back relevant elements when backtracking
        element=numbers.pop(N)
        numbers.insert(N+i,element)


numbers=[1,2,3]
permute(numbers)
为什么在运行上述代码时,它会生成正确的输出:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
但当我试图将结果累加到列表中时:

def permute(numbers, permutations, N=0):
    # base case
    if N == len(numbers):
        print numbers
        permutations.append(numbers)
        return

    for i in range(len(numbers)-N):

        # swapping relevant elements
        element=numbers.pop(N+i)
        numbers.insert(N,element)

        # recursive call
        permute(numbers, permutations, N+1)

        # swapping back relevant elements when backtracking
        element=numbers.pop(N)
        numbers.insert(N+i,element)


numbers=[1,2,3]
permutations=[]
permute(numbers, permutations)

print "-----------"
for p in permutations:
    print p
输出如下:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
-----------
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3]

不完全是我所期望的…

所有附加到
排列中的项目实际上都是相同的列表。改变一个会改变所有其他的。最简单的修复方法是在添加列表之前复制列表,这样以后对
数字的更改对已经添加的结果没有影响

def permute(numbers, permutations, N=0):
    # base case
    if N == len(numbers):
        print numbers
        permutations.append(numbers[:])
        return
结果:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
---------
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

这不回答你的问题,但是考虑使用标准<代码>迭代器。排列< /代码>方法。这是家庭作业,我必须自己实现它…有一个更简单的方式感谢你的帖子。它们确实是相同的列表,但python的append不是应该以新的顺序深度复制数字吗?我不这么认为。该声明与append观察到的行为不一致,并且在
帮助(list.append)
中没有提到深度复制。作为一个简单的演示,
a=[1,2,3];b=[];b、 附加(a);b[0]是一个
函数,它给出True,但如果发生深度复制,则我们预期为False。