python 递归时存储中间变量要用copy 方法,否则出栈就废了
2017-09-12 10:49
836 查看
在做leecode 51 NQUEENS 遇到的问题,一开始怎么都调不出bug
注意 res.append(A),但是输出结果
这时只要将 第10行变成 复制就好了
原因分析:
递归的时候变量都保存在栈里,res里面存的是 A 的地址。但是,当递归函数运行结束,A 就被pop掉了
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掉了
相关文章推荐
- python 环境变量和import模块导入方法(详解)
- python中查看变量内存地址的方法
- 用Python计算幂的两种方法,非递归和递归法
- Python(私有变量)类中的特殊方法
- python线程的使用方法以及全局变量的应用
- Mysql存储过程查询结果赋值到变量的方法
- 详解python的数字类型变量与其方法
- python二分查找算法的递归实现方法
- Python cookbook(数据结构与算法)将序列分解为单独变量的方法
- python中查看变量内存地址的方法
- Python两个变量的值进行交换的方法
- python变量—内存存储
- 本方法学python 习题24(综合练习) 习题25(更多关于函数和变量的练习)习题26(修改程序)
- Python中列表的copy方法
- Python 非递归方法的全排列
- block为什么用copy?利用runtime运行时的objc_方法为分类扩充成员变量
- python中数据的变量和字符串的常用使用方法
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- python语言实现阶乘的两种方法---递归和迭代