2011-11-02 4 views
8

この質問は、ユーティリティよりも好奇心についてです。デーモンのような永遠に実行されるはずの関数を書いている場合、関数の最後から関数をもう一度呼び出すと、Pythonはそれをどのように処理しますか?Pythonの無限ループに無限回帰を使用するのは罪でしょうか?

def daemonLoop(): 

    # Declare locals 

    # Do stuff 

    daemonLoop() 

は私がCでこれを行うことは、スタックオーバーフローを引き起こすだろうとかなり確信しているが、私は異なる方法で処理されたものを推測しているのPythonにCから抽象化のレベルを与えられました。

私は地獄に行くだろうか?

+0

人はデーモンではなくデーモンループのために地獄に行きます;-) Pythonでは、 "RuntimeError:最大再帰深度を超過しました"という例外が表示されます。 –

答えて

16

ほとんどすべてのPythonインタプリタで、Cと同じようにスタックオーバーフローが発生します。これを可能にする上位レベルの機能は、Tail Call Optimizationまたはテール再帰消去となり、the benevolent dictator of Python opposes adding this to the languageと呼ばれます。

このスタイルは、Pythonでは非慣習であるとみなされ、単純なループが好ましいです(while True:)。おそらく

1

daemonLoopから戻ってこない場合は、最終的にエラーが発生します(これはおそらくあなたが使用しているものです)。他のバージョンについてはわかりません。

+0

あなたが戻ってこない場合、インタープリタはエラーをなぜ出しますか?これは不明確または間違っています。 – agf

5

を超えました。

Would I go to hell for this?

はい。 CPythonにはTail Recursion Elimination/Last Call Optimizationはありません。

def recurse(): 
    recurse() 

recurse() 

エラー:

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

あなたは単に無限ループwhileを持つことができたときにそのようなことをやって考えるだろう、なぜ私は知りません。とにかくそれが動作するかどうかについてあなたの質問のために:

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

だから、地獄です。

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

この種の再帰は、SchemeのようなLispの方言です。

+0

ええ、それは問題ではありませんでした。 – delnan

関連する問題