[英]How to reduce the running time of Fibonacci sequence (recursive function)
n = 1
rep = 0
def f(n):
if n == 0:
return 0
if n == 1:
return 1
return f(n - 1) + f(n - 2)
while rep <= 50:
print(f(n))
rep += 1
n += 1
我需要打印斐波那契数 1~50
但是由于代码的运行时间而发生错误。
问:如何修复此代码以更快地运行?
Q. 答案代码将前一个数 F(n-2) 移动到一个临时函数,并将当前数 F(n-1) 携带到前一个数 F(n-2); 当斐波那契数列在一个列表中时,这使得这两个数字倒退了一步。
(如果有问题,请忽略 Q2)
您需要保存所有已处理的数字,以便您的代码可以快速访问这些值。
您的代码在做什么,对于数字n
,它正在以这种方式处理。
f(n) = f(n-1) + f(n-2)
= (f(n-2) + f(n-3)) + (f(n-3) + f(n-4))
= ((f(n-3) + f(n-4)) + (f(n-4)+f(n-5))) + ((f(n-4) + f(n-5)) + (f(n-5)+f(n-6))
.
.
.
so on
所以你可以看到,对于单个n
,代码多次调用几个值。 如果n
更改为n+1
则再次遵循整个相同的过程。
所以为了克服这个问题,你需要保存每次调用的结果,这样我们就可以在 O(1) 时间内得到结果。
您可以使用lru_cache
(内置)或dict
(使用自定义装饰器/函数)来保存每个斐波那契索引结果的值。
使用下面的lru_cache
添加代码。
from functools import lru_cache
n = 1
rep = 0
@lru_cache
def f(n):
if n == 0:
return 0
if n == 1:
return 1
return f(n - 1) + f(n - 2)
while rep <= 50:
print(f(n))
rep += 1
n += 1
请注意,您不需要递归:
a,b=0,1
print(a,b,end=' ')
for i in range(9):
a,b=b,a+b
print(b,end=' ')
Result:
0 1 1 2 3 5 8 13 21 34 55
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.