python 请解释理解回溯递归的错误

lyr7nygr  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(102)

我正在尝试使用回溯递归来求解#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])。我无法理解为什么会这样。

gwbalxhn

gwbalxhn1#

我把代码弄出来了。我做了一些改动:
1.将res.append(r)替换为res.append(r.copy())
1.我没有使用r = r[:-1],而是使用了r.pop()。
我不明白第二点,为什么r.pop()可以工作,而r = r[:-1]不行?

相关问题