2017-01-26 3 views
1

Ich möchte Zugriff auf Listen, die während der Rekursion erstellt werden, aber ich bekomme nur Zugriff auf die erste.Listen in rekursiver Funktion

my_data = [1,2,3,4,5] 

def my_function (some_data): 
    some_list = [] 
    for i in range(len(some_data)-1): 
     some_list.append(some_data[i+1]+some_data[i]) 

    if len(some_list)>1: 
     my_function(some_list) 

    return some_list[0] 

forty_eight = my_function(my_data) 

so ist die Idee, dass ich während der ersten Stufe Summe jeden Nachbarn Element bekommen, so dass ich [3,5,7,9], ich next [8,12,16], dann [20 , 28] und das endlich bekomme ich [48].

Da die letzte Liste ein einzelnes Element hat, möchte ich es an die Variable namens "forst_eight" zurückgeben, aber das Problem ist, dass diese Variable gleich drei ist. Das bedeutet, wenn das Programm nach dem Return-Befehl die erste Liste verwendet, die ich erstellt habe, und nicht die letzte. Was soll ich tun, um vierzig gleich 48 zu machen?

Antwort

1

Sie haben vergessen, Ihren Rekursionsanruf return my_function(some_list) zurückzugeben. Dies ist wichtig, weil Sie immer wieder my_function aufrufen, bis Ihre Abbruchbedingung erfüllt ist, aber Sie nie den Wert zurückgeben, so wird nur die ursprüngliche Liste wirklich verwendet.

my_data = [1,2,3,4,5] 

def my_function (some_data): 
    some_list = [] 
    for i in range(len(some_data)-1): 
     some_list.append(some_data[i+1]+some_data[i]) 

    if len(some_list)>1: 
     return my_function(some_list) 

    return some_list[0] 

forty_eight = my_function(my_data) 
print forty_eight # >>> 48 
+0

vielen Dank, nicht noch verstehen, warum es funktioniert. Werde versuchen, Informationen zu finden. – Demaunt

+0

Es hat funktioniert, aber Sie haben den Wert nicht verwendet :) – ppasler

1

Sie rufen Ihre innere Funktion, aber Sie verwenden nicht ihre Ausgabe. Sie sollten wahrscheinlich

if len(some_list)>1: 
    return my_function(some_list) 
0

Was Sie tun, ist die Verarbeitung alles richtig, aber nicht den richtigen Wert zurückgeben. Wenn alle rekursiven Funktionen die Verarbeitung beenden, gibt Ihre Funktion den ersten Wert zurück. Bearbeiten Sie Ihre Funktion, um den Wert der rekursiven Funktion als neuen Wert zurückzugeben.

if len(some_list) > 1: 
    return my_function(some_list) 
0

Andere Leute haben die spezifischen Probleme mit Ihrer aktuellen Implementierung angesprochen. Ich poste diese Antwort nur, um einen alternativen Ansatz für Ihr Ziel zu bieten, benachbarte Elemente in einer Liste, die Sie vielleicht etwas klarer finden, rekursiv zu summieren.

def sum_reduce(l): 
    if len(l) == 1: 
     return l[0] 
    else: 
     summed_neighbours = [a + b for a, b in zip(l[:-1], l[1:])] 
     print(summed_neighbours) 
     return sum_reduce(summed_neighbours) 

if __name__ == '__main__': 
    print('Result: ', sum_reduce([1,2,3,4,5])) 

Ausgabe

[3, 5, 7, 9] 
[8, 12, 16] 
[20, 28] 
[48] 
Result: 48 
Verwandte Themen