python-3.x - 无法使用python计算斐波那契数
问题描述
import math
import sys
sys.setrecursionlimit(8000000)
f = {1:2,2:3,3:5}
def fib(n):
if n in f:
return f[n]
if n == 1:
return 2
if n == 2:
return 3
if n == 3:
return 5
val = fib(n-1) + fib(n-2)
if n not in f:
f[n] = val
return f[n]%1000000007
print(fib(4000))
此代码无法完成/命令提示符崩溃。我怎样才能使它变得更好?
是否需要启用任何设置才能使该程序完整?
解决方案
直接从数学定义实现斐波那契数列是一个说明递归解决方案问题的练习。它导致递归函数调用呈指数级增长,即使是现代计算机也无法处理。最大的问题是,对于较大的 值n
,您将计算fib(1)
指数次数。
这个问题有几种解决方案:
使用 memoization 存储已经计算的值。然后您查找计算值并立即返回它而不进行任何进一步的计算。这是一个很好的练习来了解记忆是如何工作的。但是,它仍然是低效的,因为您仍然不必要地执行递归函数调用。
实施迭代解决方案。我不打算在这里详细介绍。我建议您进行一些研究以找到将
fib(n)
在线性时间而不是指数时间内实现的迭代解决方案。实施封闭公式。数学家已经解决
fib(n)
了一个封闭的公式。无论n
您使用多大的一个,此解决方案都将花费恒定的时间。
推荐阅读
- kubernetes - Kubernetes 是否可以在没有故障转移/负载均衡器的情况下使用 kubeadm 实现高可用性?
- flutter - Flutter:嵌套异步 HTTP 调用的最佳实践
- javascript - chrome 和 IE 中的 ScrollHeight 值不同
- ios - MKMapView:偏移贴图,使注解可见
- jquery - 在超链接jQuery中使用表格内容
- spring - 弹簧 jms。如何不缓存连接。故障转移测试
- cobol - 如何引用模棱两可的顶级变量?
- xml - 如何组合几个 XSLT 转换?
- mysql - 来自 wamp 的备份文件显示表,但错误提示表不存在
- javascript - 无法在 Angular 2 中访问子服务的成员