Python中fibonacci程序的递归深度限制

Python中fibonacci程序的递归深度限制,python,algorithm,Python,Algorithm,我有一个Python程序,它对多达999的斐波那契序列执行得非常快。对于999以上的数字,程序会失败,并出现递归错误:比较中超过了最大递归深度。我正在利用记忆来缓存先前值的斐波那契 这是我的密码 def fibonacci(position, cache=None): if cache is None: cache = [None] * (position + 1)

我有一个Python程序,它对多达999的斐波那契序列执行得非常快。对于999以上的数字,程序会失败,并出现
递归错误:比较中超过了最大递归深度
。我正在利用记忆来缓存先前值的斐波那契

这是我的密码

            def fibonacci(position, cache=None):
                if cache is None:
                    cache = [None] * (position + 1)

                if cache[position] is not None:
                    return cache[position]

                else:
                    if position < 3:
                        return 1
                    else:
                        cache[position] = fibonacci(position - 1, cache) + fibonacci(position - 2, cache)

                return cache[position]
def fibonacci(位置,缓存=无):
如果缓存为无:
缓存=[None]*(位置+1)
如果缓存[位置]不是无:
返回缓存[位置]
其他:
如果位置<3:
返回1
其他:
缓存[位置]=斐波那契(位置-1,缓存)+斐波那契(位置-2,缓存)
返回缓存[位置]

有人知道我如何改进我的解决方案吗?

有一个更简单的解决方案,可以避免递归:

def fibonacci(position):
    if position < 3:
        return 1
    i = 3
    last1 = 1
    last2 = 1
    while i <= position:
        result = last1 + last2
        last2 = last1
        last1 = result
        i+=1
    return result
def fibonacci(位置):
如果位置<3:
返回1
i=3
last1=1
last2=1

我认为有一个封闭形式的解决方案,因此不需要递归。您可以进行迭代。你决定递归吗?Python有一个最大递归深度限制。因此,要么不使用递归,要么增加最大递归。但是第二个选项是非常不推荐的。您可以更改堆栈大小()或不使用递归解决方案。@这里的问题不是如何编写序列,而是如何处理递归深度问题。您可以用矩阵形式表示斐波那契函数,然后使用有效的矩阵乘法,将幂减半并平方。这使得递归堆栈为O(logn),而不是O(n),翻译成Python很容易,当这个问题结束时,我刚刚完成了这项工作。