Python max Rekursion, Frage über sys.setrecursionlimit ()

Ich habe eine Frage über sys.setrecursionlimit ()

Aus der python doc diese Funktion:

Legen Sie die maximale Tiefe des Python-Interpreter-Stacks fest, um zu begrenzen. Diese Grenze verhindert, dass unendliche Rekursion einen Überlauf des C-Stacks verursacht und Python abstürzt. Die höchstmögliche Grenze ist plattformabhängig. Ein Benutzer muss möglicherweise die Grenze höher einstellen, wenn sie ein Programm hat, das eine tiefe Rekursion erfordert und eine Plattform, die eine höhere Grenze unterstützt. Das sollte mit Sorgfalt geschehen, denn eine zu hohe Grenze kann zu einem Crash führen.

Hier ist meine Frage:

Nehmen wir diese nutzlose rekursive Funktion:

def rec(N): if N==0: return 1 else: return rec(N-1); 

Nun lass uns die max rekursion auf 100 setzen:

 sys.setrecursionlimit(100) 

Wenn ich versuche rec(99) (100 rekursive Anrufe) bekomme ich:

 RuntimeError: maximum recursion depth exceeded 

Um re (99) zu berechnen, muss ich die Rekursionsgrenze auf 105 setzen

Warum ist das so ?

3 Solutions collect form web for “Python max Rekursion, Frage über sys.setrecursionlimit ()”

Es ist schlecht benannt. Es sollte sagen, Stack Tiefe, nicht Rekursion Tiefe. Rekursion impliziert, dass es immer wieder der gleiche Thread ist, dass es beschränkt ist. In Wirklichkeit könntest du echten Code haben, der gerade 100 tiefe Anrufe hat. Ich würde es nicht empfehlen, aber du könntest Sie können damit davonkommen, weil in der praktischen Welt die einzige Zeit, die Sie jemals in diesem Szenario laufen, mit Rekursion ist. Wenn Sie hierher stürzen, sehen Sie das Wort "Rekursion" gibt Ihnen einen sofortigen Hinweis darauf, was zu suchen, im Gegensatz zu "Stack".

(Stack sollte jedem anständigen Programmierer den gleichen Hinweis geben, aber lasst uns ehrlich sein, dein Code ist einfach abgestürzt und du willst eine relevante Fehlermeldung, richtig? 99.99999% der Zeit, die dir genau das erzählt, was du durcheinander gebracht hast (du hast deinen Basisfall verpasst Rekursion.))

Es gibt noch Funktionsaufrufe, die Python-Laufzeit ausführen muss, um sogar zu deiner Funktion zu gelangen.

Es basiert auf der TOTAL Stapeltiefe und nicht wirklich die Tiefe einer bestimmten Einzelfunktion. Sie sind wahrscheinlich schon in einer Stapeltiefe von 5, wenn Sie den ersten Aufruf zu rec () machen.

Nehmen wir zum Beispiel 5 rekursive Funktionen. Jeder macht 98 rekursive Anrufe mit dem letzten, der zur nächsten rekursiven Funktion ist. Mit einem Rekursionslimit von 100 wollen Sie wirklich jede rekursive Funktion erlauben, 99 Anrufe für eine Gesamttiefe von ~ 500 Anrufen zu machen? Nein, das könnte der Dolmetscher in diesen Tiefen stürzen.

Daher ist die Rekursionsgrenze die maximale Tiefe aller Funktionen global, keine einzige benannte Funktion.

  • Refactoring zur Beseitigung der globalen Variablen in rekursiver Funktion
  • Merkwürdiges Rekursionsverhalten in Python
  • Rekursiv finden Sie die kth größte int in Liste der Liste der int in Python
  • Refactoring rekursive "Vorkommen von" Funktion
  • Wie man sogar und ungerade Zahlen eines Arrays mit Rekursion summiert
  • Lock-Kombinationen für dynamische Sperrgröße
  • Ich versuche, eine Funktion zu machen, die max aus verschachtelter Liste zurückgibt?
  • Python-Rekursions- und return-Anweisungen
  • Iteration in Rekursion umwandeln
  • Python Recursive Funktion fehlende Ergebnisse
  • Rekursiv finden Sie alle Münzkombinationen, die eine bestimmte Menge produzieren
  • Python ist die beste Programmiersprache der Welt.