Python在处理大数字时崩溃
我刚开始学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)]