Python在处理大数字时崩溃

1 投票
2 回答
1296 浏览
提问于 2025-04-17 13:47

我刚开始学Python,但我遇到了一个挑战,要用递归的方式创建一个斐波那契数列生成器,帮助我熟悉这门语言。问题是,当我尝试生成超过3226或3227个斐波那契数时,Python就崩溃了。(我用的是Python 3)

注意:我在PHP、JavaScript上编程经验丰富,VBA和Java也有一点基础,但对Python完全是新手。所以如果这只是因为数据类型不对之类的问题,我真的很抱歉。

import sys
sys.setrecursionlimit(1000000000)

cache = dict()

 def fibonacci(n, arr = False):
    global cache

    if n == 0 or n == 1:
         r = n
    else:
        nVal1 = n - 1
        nVal2 = n - 2
        if (not nVal1 in cache):
            num1 = cache[nVal1] = fibonacci(nVal1, arr)
        else:
            num1 = cache[nVal1]
        if (not nVal2 in cache):
            num2 = cache[nVal2] = fibonacci(nVal2)
        else:
            num2 = cache[nVal2]

        r = num1 + num2


     if arr != False:
        arr.append(r)


    return r

fib = list()
# 3227 is max without generating a list.
# 3226 is max when generating a list.
fibonacci(3226, fib)
for x in fib: print(x)

我该怎么做才能生成更多的斐波那契数呢?我不认为是内存不够,因为这个程序在我那台慢慢的i3笔记本上大约两秒就能运行完。

2 个回答

2

我猜你的代码可能超出了Python解释器允许的最大栈深度。当你不断调用新的函数时,最终会用完Python虚拟机为栈分配的内存。

你可以通过修改这个链接中的设置来改变这个限制,但最大深度是由具体的实现决定的。

2

在阅读关于 sys.setrecursionlimit 的说明时

最高的限制是和平台有关的。用户可能需要把这个限制调高,特别是当她的程序需要进行深层递归,而她的系统支持更高的限制时。不过,这样做要小心,因为设置得太高可能会导致程序崩溃。

我会这样实现斐波那契数列

def fib():
    a,b = 1,0
    while True:
        yield a
        b = a+b
        yield b
        a = a+b

fibs = fib()
fibo = [next(fibs) for i in xrange(100)]

撰写回答