2016-06-18 11 views
2

私は目標値を作るために追加することができる数字の組み合わせを見つけ、次の再帰的なプログラムを書いた:私は追加する)(arr.append使用しておりますので再帰関数にリストに追加する

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

result、私は正しい出力を期待していました。

プログラムが正しくても、ansにリストresultを追加できません。

どういうところが間違っていますか?

私は期待しています。この出力: [[1, 2, 2, 3], [1, 2, 5], [1, 2, 5], [3, 5]] しかし、その代わりに、私はこの出力を得る: [[], [], [], []]

+0

期待する出力は何ですか? –

+0

質問を更新しました – yask

+0

@yaskあなたはpython 2.7を使用していますか? – wind85

答えて

0

が結果リストのコピーを作成し、

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

の下のコピーが1つだけであるようにパスを結果はプログラムを流れる。したがって、resultが変更されると、ansにも反映されます。そのため、チェーンを破損して正しい結果が得られます。

+0

それは動作しますが、私はその概念を理解していません。 リストに値を追加する関数を作成すると、参照渡し関数のように機能します。私は結果変数に正しい出力を表示できるので、なぜ 'ans'変数に追加しませんか? – yask

+0

あなたはすぐに答えるのが本当に良いです。理由を教えてください。説明のない答えも役に立たない。 –

+0

私が考えることができるこの背後にある論理は、おそらくansが 'result'の参照を追加していることでしょう。 sine 'result'は後で' '''に変わり、出力は[[]、[]、[]、[]] ' – yask

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