Я довольно новичок в 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-ноутбуке около двух секунд ..

1
Student of Hogwarts 27 Янв 2013 в 03:39

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)]
2
Jakob Bowyer 26 Янв 2013 в 23:47

Я предполагаю, что вы превышаете максимальную глубину стека, разрешенную интерпретатором Python. По мере продвижения к новым функциям, вы в конечном итоге увеличите объем памяти, выделенной виртуальной машиной Python, чтобы соответствовать стеку.

Вы можете изменить http://docs.python.org/library/sys.html#. sys.setrecursionlimit до определенной точки, но максимально возможная глубина определяется реализацией.

2
argentage 26 Янв 2013 в 23:42