Python - 不一致地抛出RecursionError

时间:2017-09-29 02:35:36

标签: python recursion

为什么Python会在第10行抛出一个RecursionError但不会在第13行抛出?

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()

1 个答案:

答案 0 :(得分:0)

进一步研究一下,看起来python之前提到的可变默认参数处理实际上就是这背后的原因。每次调用函数时,都不会创建新列表,而是在定义函数时创建一个列表。

这是一个利用此功能的函数,因此调用fib(998)不会抛出RecursionError:

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]