您的位置:首页 > 编程语言 > Python开发

python 递归时存储中间变量要用copy 方法,否则出栈就废了

2017-09-12 10:49 836 查看
在做leecode 51 NQUEENS 遇到的问题,一开始怎么都调不出bug
import time
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
res = []
def solveN(A,cur=0):
if cur == len(A):
# B = A[:]
res.append(A)
print("finish",A,id(res))
return
for col in range(len(A)):
A[cur] = col
flag =True
for row in range(cur):
if A[row] == col or abs(col-A[row])==cur - row:
flag = False
break
if flag:
solveN(A,cur+1)
return
solveN([None]*n)
print(id(res))
return res
a = Solution()
print(a.solveNQueens(6))


注意 res.append(A),但是输出结果
('finish', [1, 3, 5, 0, 2, 4], 4560144936)
('finish', [2, 5, 1, 4, 0, 3], 4560144936)
('finish', [3, 0, 4, 1, 5, 2], 4560144936)
('finish', [4, 2, 0, 5, 3, 1], 4560144936)
4560144936
[[5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5], [5, 5, 5, 5, 5, 5]]
[Finished in 1.9s]
递归完成之后,发现res 里面的数据都是乱的,全变成了 5 ??????

这时只要将 第10行变成 复制就好了
if cur == len(A):
B = A[:]
res.append(B)
print("finish",A,id(res))
return
('finish', [1, 3, 5, 0, 2, 4], 4364245544)
('finish', [2, 5, 1, 4, 0, 3], 4364245544)
('finish', [3, 0, 4, 1, 5, 2], 4364245544)
('finish', [4, 2, 0, 5, 3, 1], 4364245544)
4364245544
[[1, 3, 5, 0, 2, 4], [2, 5, 1, 4, 0, 3], [3, 0, 4, 1, 5, 2], [4, 2, 0, 5, 3, 1]]
[Finished in 1.4s]

原因分析:

递归的时候变量都保存在栈里,res里面存的是 A 的地址。但是,当递归函数运行结束,A 就被pop掉了

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: