我对Python很陌生,但我遇到了这个挑战,以递归方式创建一个Fibonacci生成器,让我使用该语言。问题是,如果我发现超过3226/3227个Fibonacci数,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笔记本电脑上运行大约两秒钟。
答案 0 :(得分:2)
可能的最高限制取决于平台。用户可能需要 当她有一个需要深度的程序时,将限制设置得更高 递归和支持更高限制的平台。这应该是 小心,因为太高的限制可能会导致崩溃。
我会像这样实施fibo
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)]
答案 1 :(得分:2)
我猜你超过了python解释器允许的最大堆栈深度。当你进一步进入新的功能时,你最终将通过python VM分配的内存量来适应堆栈。
您可以将http://docs.python.org/library/sys.html#sys.setrecursionlimit更改为某个点,但可能的最大深度是实现定义。