2016-05-06 6 views
1

Ich versuche, meinen Kopf um Rekursion zu wickeln und habe eine Frage. Auf meinem Rechner gibt sys.getrecursionlimit()1000, was bedeutet, dass ich eine Funktion höchstens 1000 mal rekursiv aufrufen kann. Aber ich bin in der Lage den folgenden Code erfolgreich auszuführen:Systemrekursionsgrenze wird umgangen?

def sum_badly(S, start, stop): 
    if start == stop: 
     return S[start] 
    else: 
     return sum_badly(S, start, (start+stop)//2) + sum_badly(S, (start+stop)//2 + 1, stop) 

MAX = 100000 
S = range(MAX) 
print(sum_badly(S, 0, MAX-1)) 

Diese fast augenblicklich beendet, und gibt mir die erwartete Antwort von 4999950000. Wie aber kann mein Programm die Rekursionsgrenze von 1000 umgehen?

+0

Warum denkst du, dass es mehr als 1000 rekursive Aufrufe macht? – user2357112

+0

@ user2357112 Sehr interessante Frage! Für eine Eingabegröße, die weit über 1000 liegt, verbraucht die erste Hälfte des Anrufs nach der Rückkehr nicht 1000 Anrufe? – dotslash

+0

Nein. Warum sollte es? – user2357112

Antwort

3

Eigentlich ist der ‚Rekursionstiefe‘ des Codes ist nur log_2 (100000) (ca.), die ca. 17

Natürlich ist man viel mehr Rekursion Anrufe tun, aber im Nu mehr als 17 Anrufe werden gleichzeitig auf dem Stapel (na ja, wahrscheinlich etwas mehr wegen Rundungsfehler)

Nizza Art und Weise, wie dies zu überprüfen: - schafft globalen Variable depth - verringert depth durch - sum_badly beginnt depth durch eine jederzeit erhöhen eine jederzeit sum_badly endet

Jetzt können Sie untersuchen, was der Maximalwert von depth ist und warum.

+0

Danke! Das gleiche hat mich während der Diskussion in den Kommentaren getroffen. Wie dumm von mir. :-) – dotslash

+0

cool :) Happy hacking dann. –

+0

Mehr wie kritzeln! : D Ich werde dies als Antwort akzeptieren, sobald das System es mir erlaubt. – dotslash

Verwandte Themen