递归函数(子集)返回空值(Python)

时间:2018-10-12 02:53:24

标签: python recursion

我编写了一个递归函数,以从整数列表中获取所有子集。例如,给定列表[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 = [[], [], [], [], [], [], [], []]

有人知道为什么吗?赞赏!

1 个答案:

答案 0 :(得分:5)

非常接近!问题是subset被附加到res,但后来被修改了。您想要的是subset 的“冻结”版本,而不是最终参考的“引用”。

因此,请考虑附加列表的副本,而不是res.append(subset),例如:

res.append(subset[:])

您将获得预期的结果:

[[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]