python - 使用递归时如何避免内存错误? (斐波那契数列)

标签 python recursion memory-efficient

我有以下练习:

'''FIBONACCI

   Compute the n'th Fibonacci number fib(n), defined recursively:

      fib(0) == 0, fib(1) == 1, fib(n) = fib(n - 1) + fib(n - 2)

   Input:

      A single line containing an integer n, 0 <= n <= 10.000

   Output:

      A single line with the integer fib(n).

   Example:

     Input:   10

     Output:  55
'''

可以这么说,我的原始尝试:

def fib(n):
    if n <= 1:
        return n
    if n >= 2:
        return fib(n-1) + fib(n-2)
    
n = int(input())  # Read integer n from standard input
print(fib(n))

但是,在达到最大递归深度之前,此代码最多只能处理 n = 500 左右。为了增加这个数字并创建可以处理多达 10 000 个的代码,我尝试了两件事:1)增加最大递归深度和 2)以装饰器的形式使用内存。现在代码最多可以处理大约 n = 2000:

import sys
from functools import lru_cache

sys.setrecursionlimit(10000)

@lru_cache(maxsize=None)
def fib(n):
    if n <= 1:
        return n
    if n >= 2:
        return fib(n-1) + fib(n-2)

n = int(input())  # Read integer n from standard input
print(fib(n))

当 n > 2000 时,我收到内存错误(堆栈溢出)。我该如何解决?我还能做什么?我的递归函数是否有可能,或者我是否必须以某种方式改变它才能使其工作?如有任何帮助,我们将不胜感激!

最佳答案

第 n 个斐波那契数的简单实现。不需要使用递归。

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        fa, fb = 0, 1
        for i in range(2, n + 1):
            fa, fb = fb, fa + fb
        return fb

(注意:这不是最快的。它是 O(n)。可以使用 O(log n) 解决方案 - 例如 here ,请参阅他们的方法5.)

关于python - 使用递归时如何避免内存错误? (斐波那契数列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62537748/

相关文章:

javascript - 如何计算该问答流程的最短和最长路径?

javascript - 用连字符替换字符串中的空格

java - Java 静态方法可以可视化为 python 中的函数 + 具有相同名称(作为函数)的实例方法吗?

python - 从 Python 3 和 Avro 1.7.6 开始,步骤是什么? (问答)

python - 多处理池工作线程中的线程标识符

c++ - Q_GADGET 与用于从 QML 操作 C++ 对象的多态树的访问器对象

c# - 使用内存高效方法在数组中查找重复项

python - Pyramid 烧杯 - 有没有办法创建不更新 session 时间戳的端点?

java - 递归相关: Product of two numbers

java - 分区标签问题的空间复杂度