2011-08-16 4 views
13

I持つPythonのドキュメントから一つの質問については、sys.setrecursionlimit ()Pythonの最大再帰、は、sys.setrecursionlimitについての質問()

この機能:

Pythonインタプリタの最大の深さを設定します。スタックして制限する。この制限は、無限再帰がCスタックのオーバーフローを引き起こし、Pythonをクラッシュさせないようにします。 可能な限り高い制限は、プラットフォームによって異なります。深い再帰を必要とするプログラムと上限をサポートするプラットフォームがある場合、ユーザーは上限を高く設定する必要があります。これは、あまりにも高い制限がクラッシュにつながる可能性があるため、注意して行う必要があります。ここで

は私の質問です:

はのは、この役に立たない再帰関数を見てみましょう:

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

今のは100に最大再帰を設定してみましょう:

sys.setrecursionlimit(100) 

私はrec(99)(100をしようとした場合再帰呼び出し)、私は得る:

RuntimeError: maximum recursion depth exceeded 

rec(99)を計算するには再帰制限を設定する必要があります。105

なぜそうですか?

答えて

13

名前が正しくありません。これは、スタックの深さではなく、再帰の深さと呼ばれるべきです。再帰は、それが制限されていることが何度も繰り返されることを意味します。現実には、100の深さを呼び出す実際のコードを持つことができます。私はそれをお勧めしませんが、あなたはできます。現実の世界では、このシナリオを実行する唯一の時間は再帰を伴うためです。このためクラッシュすると、「再帰」という言葉を見ると、「スタック」とは対照的に、何を探すのかが即座にわかります。

(スタックはまともなプログラマーに同じ手がかりを与えてくれるはずですが、正直言って、あなたのコードがクラッシュして、関連するエラーメッセージが表示されるようにしましょうか?これは99.99999%再帰のためのベースケース))

+0

Thx、私はもっと慎重に定義を読んで、関数の名前を見てはいけないと思います –

4

Pythonランタイムが関数に到達するために必要な関数呼び出しはまだあります。

4

これはTOTALスタック深度に基づいており、特定の単一関数の深さにはまったく基づいていません。最初にrec()を呼び出すと、おそらくスタック深度は5になります。

たとえば、5つの再帰関数を取ります。それぞれは98の再帰呼び出しを行い、最後の呼び出しは次の再帰関数を呼び出します。再帰制限が100の場合、各再帰関数が〜500コールの合計深度に対して99コールを行うことを許可したいのですか?いいえ、それは通訳者をその深みで崩壊させるかもしれません。

したがって、再帰制限は、すべての関数のグローバルな最大深度であり、単一の名前付き関数ではありません。

関連する問題