我写了下面的递归程序,它找到了可以添加的数字组合来制作目标值:
arr = [1, 2, 2, 3, 5]
target = 8
def comb_sum(arr, current_index, target, result, ans):
if target == 0:
print result
ans.append(result)
return 0
if target < 0:
return 1
if current_index == len(arr):
return 1
result.append(arr[current_index])
comb_sum(arr, current_index+1, target - arr[current_index], result, ans)
result.pop()
comb_sum(arr, current_index+1, target, result, ans)
return ans
print comb_sum(arr, 0, target, [], [])
由于我使用arr.append()追加result
,我期望输出正确。
即使程序正确,我也无法向result
添加列表ans
。
出了什么问题?
我期待这个输出:
[[1, 2, 2, 3],
[1, 2, 5],
[1, 2, 5],
[3, 5]]
但相反,我得到这个输出:
[[], [], [], []]
答案 0 :(得分:2)
import copy
arr = [1, 2, 2, 3, 5]
target = 8
def comb_sum(arr, current_index, target, result, ans):
if target == 0:
print result
ans.append(copy.deepcopy(result) )
return 0
if target < 0:
return 1
if current_index == len(arr):
return 1
result.append(arr[current_index])
comb_sum(arr, current_index+1, target - arr[current_index], result, ans)
result.pop()
comb_sum(arr, current_index+1, target, result, ans)
return ans
print comb_sum(arr, 0, target, [], [])
答案 1 :(得分:0)
复制结果列表并传递如下
comb_sum(arr, current_index+1, target - arr[current_index], result[:], ans)
只有一份结果流经该程序。因此,只要result
发生变化,它就会反映在ans
中。这就是为什么复制它会破坏链条并为您提供正确的结果