2016-06-18 15 views
2

Ich schrieb das folgende rekursive Programm angehängt, das die Kombination von Zahlen findet, die hinzugefügt werden können, um den Sollwert zu machen:auf eine Liste in rekursive Funktion

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

Da ich arr.append bin mit() anhängen die result, erwartete ich die korrekte Ausgabe.

Obwohl das Programm korrekt ist, kann ich keine resultans Liste hinzufügen.

Was ist los?

Ich erwarte diese Ausgabe: [[1, 2, 2, 3], [1, 2, 5], [1, 2, 5], [3, 5]] Aber stattdessen bekomme ich diese Ausgabe: [[], [], [], []]

+0

Was ist Ihre erwartete Ausgabe? –

+0

aktualisiert die Frage – yask

+0

@yask verwenden Sie Python 2.7? – wind85

Antwort

0

eine Kopie der Ergebnisliste machen und durch wie unten

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

Es gibt nur eine Kopie ist Ergebnis fließt durch das Programm. Wann immer sich result ändert, spiegelt sich das auch in ans wider. Aus diesem Grund bricht das Kopieren die Kette und gibt Ihnen das richtige Ergebnis

+0

Es funktioniert, aber ich verstehe das Konzept nicht. Wenn Sie eine Funktion erstellen, die einen Wert an eine Liste anfügt, funktioniert sie wie eine Funktion zum Übergeben von Referenzen. Da ich die richtige Ausgabe in der Ergebnisvariablen ausgeben kann, warum hängt sie nicht an die 'ans'-Variable an? – yask

+0

Es ist wirklich gut, dass Sie sehr bald antworten. Bitte sag warum? Eine Antwort ohne Erklärung ist auch nutzlos. –

+0

Die Logik dahinter, die ich mir vorstellen kann, ist, dass das ANS vielleicht die Referenz von "Ergebnis" anhängt. sine 'result' ändert sich später zu' '' ', es zeigt die Ausgabe als [[], [], [], []]' an – 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, [], [])