2016-05-06 6 views
1

私は再帰の周りに頭を包み込み、質問があります。私のマシンでは、sys.getrecursionlimit()1000となります。つまり、関数を再帰的に最大1000回呼び出すことができます。しかし、私は成功し、次のコードを実行することができるよ:システム再帰制限をバイパスしていますか?

def sum_badly(S, start, stop): 
    if start == stop: 
     return S[start] 
    else: 
     return sum_badly(S, start, (start+stop)//2) + sum_badly(S, (start+stop)//2 + 1, stop) 

MAX = 100000 
S = range(MAX) 
print(sum_badly(S, 0, MAX-1)) 

は、これはほぼ瞬時に終了し、私に4999950000の期待答えを与えます。しかし、私のプログラムはどのようにして1000呼び出しの再帰制限をバイパスすることができますか?実際

+0

なぜ1000を超える再帰呼び出しが行われていると思いますか? – user2357112

+0

@ user2357112非常に興味深い質問! 1000をはるかに超える入力サイズの場合、 'return'の後の呼び出しの最初の半分は' 1000'呼び出しを消費しませんか? – dotslash

+0

いいえ、それはなぜでしょうか? – user2357112

答えて

3

、あなたのコードの「再帰の深さは、」CCAもちろん17

は、あなたがはるかに再帰呼び出しを行っている場合にのみlog_2(100000)(約)ですが、時間がない以上17呼び出しは同時に、スタック上にある(まあ、より多くのため丸め誤差のおそらく少し)

これを検証するためにどのように

ニース方法: - 任意の時間がsum_badly 始まる1でdepthを高める - - depthが グローバル変数を作成することにより、depthを小さくしますいずれか1回sum_badly終了

今、depthの最大値とその理由を調べることができます。

+0

ありがとう!コメントで議論している間、同じ事が私を襲った。愚かな私。 :-) – dotslash

+0

クール:)ハッピーハッキング。 –

+0

もっと詳しくdoodling! :D私は、システムが私にできるだけ早く回答としてこれを受け入れるでしょう。 – dotslash

関連する問題