我编写了一个递归函数,以从整数列表中获取所有子集。例如,给定列表[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 = [[], [], [], [], [], [], [], []]
有人知道为什么吗?赞赏!
答案 0 :(得分:5)
非常接近!问题是subset
被附加到res
,但后来被修改了。您想要的是subset
的“冻结”版本,而不是最终参考的“引用”。
因此,请考虑附加列表的副本,而不是res.append(subset)
,例如:
res.append(subset[:])
您将获得预期的结果:
[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]