2016-03-22 10 views
-4

Ich schreibe eine grundlegende Rekursionsfunktion, die eine Ganzzahl, n, und gibt die Summe der ersten n Kehrwerte zurück. Eingabe 2 in 1.5 zur Folge haben sollte, und 0 Eingabe sollte 0Python 3 Rekursion - Maximale Tiefe überschritten

sum_to zurückkehren (2) = (1 + 1/2) = 1,5

Hier ist, was ich habe:

def sum_to(n): 
    if n>0: 
     return sum_to(1+1/n) # Not sure if this is correct 
    return 0 

Aber alles, was ich bekomme, ist eine maximale Rekursionstiefe, die überschritten wird. Ich weiß, ich könnte Listen, um das zu lösen, aber Rekursion ist wirklich faszinierend und ich möchte eine Lösung finden, die es verwendet.

+0

"Nicht sicher, ob das richtig ist" Sie sollten. Entsprechend Ihrem Programm ist sum_to (1) das gleiche wie 1 + sum_to (1). Bist du dir nicht sicher, ob das stimmt? – Goyo

+0

hängt das zufällig mit Ihrer Frage zusammen? http://stackoverflow.com/questions/31323495/1-1-2-1-3-%C2%BC-finding-sum –

+0

Wenn Sie 1 hinzufügen, wird n immer gleich 0? – AJPennster

Antwort

1

Von der Frage, wie es scheint, dass Sie

\sum_{i=1}^{n} 1/i 

Wenn der Eingang 0 ist, dann 0 zurück

Denken Sie daran, dass in einer rekursiven Funktion berechnen wollen, müssen Sie eine Basis definieren Fall und ein induktiver Satz.

In Ihrer Frage, die induktive Klausel ist:

1.0/i + sum_of_reciprocals(i-1) 

während das Basismodell zu 0 eingestellt werden kann, wenn i=0.

diese Formulierung gegeben, die Funktion mit einem Beispiel wie folgt aussieht:

def sum_to(n): 
    if n > 0: 
     return sum_to(n-1) + 1.0/n 
    else: 
     return 0 

if __name__ == '__main__': 
    print(sum_to(3)) 

und das Ergebnis 1,83333333333 ist.

Weitere Informationen zu rekursiven Funktionen finden Sie unter related wikipedia page.

+0

Vielen Dank. Kurz und prägnant. Die verlinkte Wiki-Seite ist sehr geschätzt, sie wird mir sicherlich helfen, wenn ich jetzt ein paar weitere Übungsrekursionen mache. –

1

Trace durch, um zu sehen, wenn Sie jemals Ihre Endbedingung erreichen:

(PS: an der Zeit, die ich schrieb dies der Code der Frage return 1 + sum_to(1/n) war)

sum_to(2): 
    n is 2, which is > 0 
    call sum_to(1/2) 
     n is .5, which is > 0 
     call sum_to(1/.5) 
      n is 2, which is > 0 
      call sum_to(1/2) 
... 

Ihre Funktion nie zurückgibt. Das Ergebnis wäre unendlich, wenn Sie unendlich viel Zeit und Platz hätten, um die Berechnung zu beenden, da der Algorithmus kein Ende hat.

Für Ihr Beispiel, schreiben Sie einfach es auf diese Weise:

def sum_to(n): 
    return 1 + 1/n 

Was ist das erwartete Ergebnis, wenn n> 2? Das wird bestimmen, wie organisierender Arbeitscode angegangen werden soll.

+0

Danke, ich sehe den Fehler jetzt. Das erwartete Ergebnis sollte die Summe von Kehrwerten sein. Ex. sum_to (2) = (1 + 1/2), wobei als sum_to (3) = (1 + 1/2 + 1/3) gilt. Mein Fehler, die Frage falsch zu formulieren. Ich möchte im Grunde die Kehrwerte bis zu dem Punkt finden, dass das Reziproke 1/n ist, und dort aufhören. –

+1

Also jeder gegebene Begriff an der Position "x" ist der Wert "1/x". Für den ersten Term "1/1 == 1", das zweite "1/2", das dritte "1/3". Sie wollen also '1/n + sum_to (n-1)' zurückgeben, da jeder Term eine sukzessive Position hat. Dies wird jetzt besser in albertoqls Antwort erklärt. – dsh

Verwandte Themen