RecursionError: maximale Rekursionstiefe bei Vergleich überschritten
Lösung :
Zunächst ist es besser zu wissen, dass Sie beim Ausführen einer rekursiven Funktion in Python mit einer großen Eingabe ( > 10^4) möglicherweise einen "maximale Rekursionstiefe überschritten Fehler" erhalten können.
Das sys-Modul in Python hat eine Funktion getrecursionlimit(), die die Rekursionstiefe in Ihrer Python-Version anzeigen kann.
import sys
print("Python Rekursionsbegrenzung = ", sys.getrecursionlimit())
Der Standardwert in einigen Versionen von Python liegt bei 1000 und in anderen bei 1500
Sie können diese Begrenzung ändern, aber es ist sehr wichtig zu wissen, dass bei zu großer Erhöhung ein Speicherüberlauffehler auftritt.
Seien Sie also vorsichtig, bevor Sie sie erhöhen. Sie können setrecursionlimit() verwenden, um diese Begrenzung in Python zu erhöhen.
import sys
sys.setrecursionlimit(3000)
Bitte folgen Sie diesem Link für weitere Informationen zu einigen Ursachen dieses Problems :
https://elvand.com/quick-sort-binary-search/
4 Stimmen
Siehe auch stackoverflow.com/questions/5061582/…
21 Stimmen
Memoisierung könnte die Geschwindigkeit Ihrer Funktion steigern und ihre effektive rekursive Tiefe erhöhen, indem zuvor berechnete Werte beendet werden, anstatt die Stapelgröße zu erhöhen.
6 Stimmen
Die Rekursionsobergrenze beträgt in der Regel 1000.
1 Stimmen
@Boris Warum bleibt es dann bei
997
stecken? Liegt es daran, dass der Python-Interpreter die ersten 3 Ebenen des Stapels einnimmt?6 Stimmen
@tonix der Interpreter fügt einen Stapelrahmen hinzu (die
Zeile , in
in Stapelverfolgungen) und dieser Code nimmt 2 Stapelrahmen fürn=1
(weil der Basisfalln < 1
ist, also fürn=1
rekursiert es trotzdem). Und ich nehme an, dass das Rekursionslimit nicht inklusiv ist, wie in "Fehler, wenn Sie 1000 erreichen" und nicht "Fehler, wenn Sie 1000 überschreiten (1001)".997 + 2
ist weniger als 1000, also funktioniert es,998 + 2
nicht, weil es das Limit erreicht.0 Stimmen
@Boris Also sind
997
Stapelrahmen vonrecursive_function
belegt und die letzten2
sind vom Interpreter selbst besetzt (eingebaute Zuweisung)? Habe ich das richtig verstanden?6 Stimmen
@tonix nein.
recursive_function(997)
funktioniert, bricht bei998
ab. Wenn Sierecursive_function(998)
aufrufen, werden 999 Stapelrahmen verwendet und 1 Rahmen wird vom Interpreter hinzugefügt (weil Ihr Code immer so ausgeführt wird, als ob er Teil des obersten Moduls wäre), was dazu führt, dass er das 1000er-Limit erreicht.0 Stimmen
Der Weg, wie diese Funktion geschrieben ist, führt dazu, dass es
n+1
Frames dauert, um das Ergebnis fürn
zu berechnen.0 Stimmen
@tonix, ich habe deine Frage hier gestellt stackoverflow.com/questions/59347491/…
0 Stimmen
@Boris Ich habe noch einmal nachgeschaut und in meinem Fall funktioniert
recursive_function(995, 0)
mitRekursionsgrenze = 1000
, währendrecursive_function(996, 0)
nicht funktioniert... Also denke ich, dass zusätzliche Stapelrahmen verwendet werden (Ich benutze Python 3.6).0 Stimmen
@tonix Ich habe es gerade auf Python 3.6.9 durch die REPL ausprobiert und erhalte immer noch das gleiche Verhalten, 997 funktioniert, 998 nicht. Wie führst du diese Funktion aus? Du musst es auf eine Weise machen, die 2 Stapelrahmen hinzufügt. Führst du es aus einer
main()
-Funktion oder importierst du eine Datei, in der du die Funktion definierst? Wenn du es mit IPython ausführst, wäre es nicht überraschend, wenn das auch ein paar Rahmen hinzufügt.0 Stimmen
Ich verwende direkt die Python-Befehlszeilenschnittstelle. Ich starte
python
und schreibe dann den Code auf der Eingabeaufforderung des Interpreters>>>
und führe ihn aus.0 Stimmen
@tonix verwendest du Python 2 oder 3. Wenn du nur "
python
" eingibst und nicht "python3
", ist es wahrscheinlich 2.0 Stimmen
@Boris Ich kann bestätigen, dass ich Python 3 verwende, weil ich diese Ausgabe sehe, wenn ich im CLI
python
eingebe:Python 3.6.5 (Standard, 30. März 2018, 06:42:10) [GCC 4.2.1 kompatibel Apple LLVM 9.0.0 (clang-900.0.39.2)] auf Darwin Geben Sie "help", "copyright", "credits" oder "license" für weitere Informationen ein. >>>