【问题标题】:Why is fibonnaci series with n-th term taking more time to execute in Python after 100th sequence? [duplicate]为什么第 100 个序列后第 n 项的斐波那契数列需要更多时间在 Python 中执行? [复制]
【发布时间】:2026-02-07 18:55:01
【问题描述】:

用 Python 3 编码:

def fibonacci(n):
    if(n <= 1):
        return n
    else:
        return(fibonacci(n-1) + fibonacci(n-2))
n = int(input("Enter number of terms:"))
print("Fibonacci sequence:")
for i in range(n):
    print(fibonacci(i))

输入词条数:100 斐波那契数列: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887

在此之后它卡住并且不执行下一个系列 是什么原因?

enter image description here

【问题讨论】:

  • 总之,原因是这个算法非常非常低效。
  • 是的,我同意,无论如何答案应该可以解决问题
  • 和 pari,请不要全部大写

标签: python python-3.x fibonacci


【解决方案1】:

我的电脑可以跑得更高,即使主要是因为它的算法非常糟糕。

对于这种问题,你应该使用动态规划,简而言之,你存储每个序列的结果,所以为了得到下一个,你查询你已经得到的结果,而不是重新做所有的序列。

您可以在这里阅读更多内容:https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/

将所有结果保存在内存中会占用更多空间,但您将获得更多时间。

您在循环中使用递归函数,其中递归函数的主要目标是获得 n-1,这......浪费了很多时间。其实太多了。您应该使用迭代或递归,但不能同时使用。

f = [0,1]
def fibonacci(n):
    if(n>1):
        fibonacci(n-1)
    if(n<=0):
        return
    f.append(f[n]+f[n-1])
n = int(input("Enter number of terms:"))-2
print("Fibonacci sequence:")
fibonacci(n)
for e in f:
    print(e)

老实说,我不会花太多时间来编写优化的斐波那契递归函数,虽然周围可能有很多。 我尽可能多地编辑了你的代码,试图保持这种精神。

所以,我们只启动递归函数“一次”

fibonacci(n)

我们将 n 设置为 input()-2,因为我们的序列中已经有两个数字。

f=[0, 1]

这是我们将保留序列的列表

def fibonacci(n):
    if(n>1):
        fibonacci(n-1)
    if(n<=0):
        return
    f.append(f[n]+f[n-1])

我们将在递归函数中做的是: 告诉我们需要之前的结果,直到我们降到 1。我们已经有了 f[1],所以我们不必计算它。如果我们提供类似 0 或更低的值,我们会有回报,如果某些用户输入负值,它会阻止它中断。 然后我们将结果添加到 f[]

的末尾

在我们运行递归函数之后,这将为您提供一个包含 n 的有序斐波那契序列的列表

real    0m0,034s
user    0m0,018s
sys     0m0,014s

这是我在设备上设置 n=1000 的时间

【讨论】:

  • 虽然这段代码展示了动态编程的使用,但它比实际需要的更难理解,因为您使用的是全局变量。此外,如果您不清除f,两次调用它可能无法正常工作。我建议返回缓存或将其传入。
  • 有很多事情可以做,正如我所说,我想保持这种精神。一次用户输入,一次运行,完成。但是,是的,可以改为传递缓存,我试图保持简单,我不知道传递缓存还是将其保持为全局会更容易理解。即使不清除缓存,我们也可以使用缓存的长度而不是 i(n>1) 再次启动它。
  • 我喜欢你的额外解释,现在很清楚了。
【解决方案2】:

正如上面在 cmets 中列出的,该算法效率非常低,但可能有一种方法可以加快速度,那就是使用缓存

首先导入functools模块,这是一个内置模块,所以没有理由用pip安装它

使用很简单

from functools import cache

@cache
def myFunc():
    #  your code here

最终代码

from functools import cache

@cache
def fibonacci(n):
    if(n <= 1):
        return n
    else:
        return(fibonacci(n-1) + fibonacci(n-2))
n = int(input("Enter number of terms:"))
print("Fibonacci sequence:")
for i in range(n):
print(fibonacci(i))

仅供参考,缓存使用 LRU 缓存技术,您可以了解更多信息here。还可以查看文档以获取相同的 here

【讨论】:

    最近更新 更多