Ist es eine Sünde, unendliche Rekursion für unendliche Schleifen in Python zu verwenden?

9

Bei dieser Frage geht es mehr um Neugier als um Nützlichkeit. Wenn ich eine Funktion schreibe, die ewig laufen soll, zum Beispiel einen Daemon, wie würde Python damit umgehen, wenn ich die Funktion am Ende der Funktion erneut aufrufen würde?

%Vor%

Ich bin mir ziemlich sicher, dass dies in C zu einem Stack-Überlauf führen würde, aber angesichts der Abstraktionsebene von C zu Python rate ich anders behandelt.

Würde ich dafür in die Hölle gehen?

    
Hubro 02.11.2011, 03:29
quelle

6 Antworten

17

In fast allen Python-Interpretern, die einen Stack-Überlauf verursachen, wie in C. Die Funktion auf höherer Ebene, die dies zulässt, heißt Tail Call Optimization oder Tail Recursion Elimination und der wohlwollende Diktator von Python lehnt das Hinzufügen ab das zur Sprache .

Dieser Stil wird für Python als nicht-idiomatisch angesehen und eine einfache while True: -Schleife wird bevorzugt.

    
Jeremy Banks 02.11.2011, 03:31
quelle
5

Die maximale Rekursionstiefe kann mit sys.getrecursionlimit() abgerufen und mit sys.setrecursionlimit() .

  

Würde ich dafür in die Hölle gehen?

Ja. CPython hat keine Tail Recursion Elimination / Last Call Optimierung.

%Vor%

Fehler:

%Vor%     
agf 02.11.2011 03:33
quelle
1

Die C-Version des Python-Interpreters (die Sie wahrscheinlich verwenden) wird einen Fehler verursachen, wenn Sie nie von daemonLoop zurückkehren. Ich bin mir nicht sicher über andere Versionen.

    
rob mayoff 02.11.2011 03:31
quelle
1

Ich weiß nicht, warum du darüber nachdenken solltest, wenn du einfach eine unendliche while -Schleife haben könntest. Anyway für Ihre Frage, ob es funktioniert:

%Vor%

Also ja, verdammt nochmal.

    
AusCBloke 02.11.2011 03:34
quelle
0

Wahrscheinlich keine gute Idee ....

%Vor%

RuntimeError: Maximale Rekursionstiefe überschritten

Ссылка

    
Tony 02.11.2011 03:33
quelle
0
%Vor%

Diese Art von Rekursion ist, was Lisp-Dialekte wie Scheme gemacht sind!

    
Christian Calderon 02.11.2011 05:57
quelle