我正在尝试使用回溯递归来求解#78 Leetcode (Subsets),其思想是通过选择索引'i'处的值或不选择该值来创建所有可能的组合,然后递归直到列表的末尾。
我写了这段代码:
nums = [1,2,3]
res,r = [],[]
def bts(nums,r,i):
if(i == len(nums)):
print(i,r)
res.append(r)
return
r.append(nums[i])
print(i,r)
bts(nums,r,i+1)
print(i,r)
r = r[:-1]
print(i,r)
bts(nums,r,i+1)
print(i,r)
return
bts(nums,r,0)
print(res)
写print(i,r)
行是为了调试并查看我的算法哪里出错了。我注意到当bts(nums,[1,2],3)
被调用时,[1,2]
被推送到子集之后,末尾的return语句返回到i=1
迭代,(i,r)
值为(1,[1,2,3])
而不是(1,[1,2])
。我无法理解为什么会这样。
1条答案
按热度按时间gwbalxhn1#
我把代码弄出来了。我做了一些改动:
1.将res.append(r)替换为res.append(r.copy())
1.我没有使用r = r[:-1],而是使用了r.pop()。
我不明白第二点,为什么r.pop()可以工作,而r = r[:-1]不行?