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。