gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:36:49 24 4
gpt4 key购买 nike

我有以下练习:

'''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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com