2017-09-29 17 views
0

なぜPythonはLine 10ではRecursionErrorをスローしますが、13行目ではリジェクトしません。Python - RecursionErrorが一貫してスローされない

def fib(n, a = [0,1]): 
    if len(a) > n: 
     return a[n] 
    a.append(fib(n - 1, a) + fib(n - 2, a)) 
    return a[n] 


def main(): 
    x = 998 
    print(fib(x)) # RecursionError 

    for i in range(1000): 
     print(fib(i)) # No Error 

main() 
+0

関連していないが、それ[可変デフォルトの引数](HTTPに気を付ける:// FIB(998)を呼び出すとRecursionErrorをスローしないように、ここで

は、この機能を悪用する機能ですdocs.python-guide.org/en/latest/writing/gotchas/)これは起こるのを待っているバグです。 –

+0

@ juanpa.arrivillaga私はpythonがこれらを処理する方法を知らなかった、ありがとう! –

+0

整数を昇順にループすると、 'fib()'の各呼び出しは、それらの2つの低い値がすでにキャッシュに入っているため、1レベル深くしか再帰しません。あなたが行くことができる高さには本当に制限はありません。しかし、大量の 'fib()'を開始するように頼むと、0と1に至るまで再帰します。 – jasonharper

答えて

0

さらにこれを見ると、前述したPythonの既定の引数の扱いが実際にこのような理由になっているようです。関数が呼び出されるたびに新しいリストを作成するのではなく、関数が定義されたときにリストが1回作成されます。

def fib(n, a = [0,1]): 
    if len(a) > n: 
     return a[n] 
    while len(a) <= n: 
     a.append(fib(len(a) - 1) + fib(len(a) - 2)) 
    return a[n] 
関連する問題