递归函数中的列表追加

3

我编写了下面这个递归程序,它可以找到可以相加得到目标值的数字组合:

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]]

但实际上我得到了以下输出结果:

[[], [], [], []]

更新了问题 - yask
是的,https://ideone.com/Ro88Fs - yask
1
按照这种推理,返回任何东西都可以。如果你不打算使用返回的内容,就不要返回任何东西,但是如果你要返回内容,那就让它有意义。 - tobias_k
我正在返回ans,它应该是我正在解决的问题的正确答案:找到可以相加以达到目标值的数字组合的程序: - yask
啊!懂了!有道理。 - yask
显示剩余6条评论
2个回答

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, [], [])

0

复制结果列表并按以下方式传递

comb_sum(arr, current_index+1, target - arr[current_index], result[:], ans)

整个程序中只有一个结果副本在流动。因此,每当 result 改变时,ans 也会反映出来。这就是为什么复制它会破坏链条并给出正确结果的原因。

它能工作,但我不理解这个概念。如果你创建一个将值附加到列表的函数,它就像是一个传递引用的函数。由于我能够在结果变量中打印出正确的输出,为什么它不能附加到“ans”变量中呢? - yask
很好,你回答得非常快。请说一下原因?没有解释的答案也是无用的。 - Rahul K P
我能想到的这个逻辑是,可能ans正在附加result的引用。由于result后来更改为'',因此它显示的输出为[[],[],[],[]] - yask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接