Python大量崩溃

时间:2013-01-26 23:39:16

标签: python

我对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笔记本电脑上运行大约两秒钟。

2 个答案:

答案 0 :(得分:2)

阅读sys.setrecursionlimit

中的笔记
  

可能的最高限制取决于平台。用户可能需要   当她有一个需要深度的程序时,将限制设置得更高   递归和支持更高限制的平台。这应该是   小心,因为太高的限制可能会导致崩溃。

我会像这样实施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更改为某个点,但可能的最大深度是实现定义。