2011-11-02 8 views
8

To pytanie dotyczy raczej ciekawości niż użyteczności. Jeśli piszę funkcję, która ma działać na zawsze, na przykład demona, w jaki sposób Python poradzi sobie z nią, jeśli ponownie wezwę funkcję od końca funkcji?Czy używanie Pythona w nieskończonej pętli przy użyciu nieskończonej rekursji jest grzechem?

def daemonLoop(): 

    # Declare locals 

    # Do stuff 

    daemonLoop() 

Jestem prawie pewien, że robi to w C spowoduje przepełnienie stosu, ale biorąc pod uwagę poziom abstrakcji od C z Pythonem Zgaduję rzeczy są traktowane inaczej.

Czy pójdę do piekła za to?

+0

Ludzie idą do piekła dla demonów, nie dla demonów ;-) W Pythonie otrzymasz wyjątek "RuntimeError: przekroczono maksymalną głębokość rekursji". –

Odpowiedz

1

Wersja C interpretera Pythona (który prawdopodobnie używasz) spowoduje błąd, jeśli nigdy nie wrócisz z daemonLoop. Nie jestem pewien innych wersji.

+0

Dlaczego tłumacz miałby zgłaszać błąd, jeśli nigdy nie wrócisz? Jest to albo niejasne, albo błędne. – agf

5

Maksymalna głębokość rekurencji mogą być pobierane z sys.getrecursionlimit() i ustawić z sys.setrecursionlimit().

Would I go to hell for this?

Tak. CPython nie ma eliminacji rekursji ogona/optymalizacji ostatniego połączenia.

def recurse(): 
    recurse() 

recurse() 

Błąd:

 
    # 1000 or so lines of this: 
    File "", line 2, in recurse 
RuntimeError: maximum recursion depth exceeded 
1

nie wiem dlaczego można by pomyśleć o zrobieniu czegoś podobnego, kiedy można po prostu mieć nieskończoną while pętlę. W każdym razie na twoje pytanie, czy to zadziała:

... 
    File "test.py", line 7, in daemonLoop 
    daemonLoop() 
    File "test.py", line 7, in daemonLoop 
    daemonLoop() 
RuntimeError: maximum recursion depth exceeded 

Więc tak, do diabła.

0
(define forever (lambda() (forever))) 

Ten rodzaj rekurencji jest tym, za co tworzone są dialekty Lisp, takie jak Schematy!

+0

Tak, ale to nie było pytanie. – delnan