python - 递归函数(子集)返回空(python)
问题描述
我编写了一个递归函数来从整数列表中获取所有子集。例如,给定一个 list [1, 2, 3]
,返回值为[[],[1],[2],[3],[1, 2],[1, 3],[2, 3],[1, 2, 3]]
。
这是我的代码:
def subsets(nums):
def helper(subset, i):
if i == len(nums):
print('return = ', subset)
res.append(subset)
else:
helper(subset, i+1)
subset.append(nums[i])
helper(subset, i+1)
subset.remove(nums[i])
res = []
helper([], 0)
return res
我在每次递归中打印出来subset
,他们是对的。然而,最终的回报res
总是空的。
return = []
return = [3]
return = [2]
return = [2, 3]
return = [1]
return = [1, 3]
return = [1, 2]
return = [1, 2, 3]
res = [[], [], [], [], [], [], [], []]
有谁知道为什么?欣赏它!
解决方案
很接近了!问题是subset
被附加到res
,但后来被修改。您想要的subset
是 then的“冻结”版本,而不是最终将成为的“参考”。
因此res.append(subset)
,请考虑附加列表的副本,而不是 ,例如:
res.append(subset[:])
你会得到你预期的结果:
[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]
推荐阅读
- mysql - django.db.utils.OperationalError: (2026, 'SSL connection error: SSL_CTX_set_tmp_dh failed') 同时连接到本地主机 MYSQL
- r - 'git2r_clone' 中的错误:尝试在 R 中克隆存储库时不受支持的 URL 协议
- apache-spark - 尝试访问 UDF 中的广播变量时,Spark 无限期冻结
- java - Dropwiazrd @CacheControl 未应用缓存控制标头
- vba - 如何使 VBA 宏窗体可扩展?
- android - 在 Flutter for BottomModalSheet 小部件中找不到脚手架错误,即使它是在脚手架内定义的
- excel - GetOpenFile 中的 InitialFileName 问题
- swift - 在 InsertItems(at:) 之后未调用 UICollectionView cellForItemAt - 如何预加载下一个单元格?
- algorithm - 如何用递归证明插入排序的正确性?
- android - 为什么在视图模型中声明变量时使用下划线 kotlin 约定