繁体   English   中英

如何减少斐波那契数列的运行时间(递归函数)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM