方法一:传统递归法

时间复杂度O(2^n),空间复杂度O(n)

计算Fibonacci(10)十次平均用时0.0003s    计算Fibonacci(100)单次用时大于1min

时间复杂度极高,当n>35左右时间已经无法接受

defFibonacci(n):

if n == 1 or n == 2:

return 1

return Fibonacci(n - 1) + Fibonacci(n - 2)

方法二:动态规划法

时间复杂度O(n),空间复杂度O(1)

计算Fibonacci(10)十次平均用时小于0.00001s    计算Fibonacci(100)十次平均0.0001s    计算Fibonacci(10000)十次平均0.008s    计算Fibonacci(1000000)十次平均9.525s

defFibonacci(n):

current, pre = 1, 0

for i in range(n - 1):

current, pre, = current +pre, current

return current

方法三:通项公式法

时间复杂度O(log n),空间复杂度O(1),通项公式法的时间复杂度不是O(1),这是因为计算n次幂不能做到O(1)时间复杂度,使用快速幂算法可以做到(log n)时间复杂度

计算Fibonacci(10)十次平均用时小于0.00001s    计算Fibonacci(100)十次平均用时小于0.00001s

计算Fibonacci(10000)数字太大,出现OverFlow错误    计算Fibonacci(1000000):数字太大,出现OverFlow错误

由于开方和四舍五入存在精度误差,经过测试,使用通项公式法计算斐波那契数列在第71项时开始出现精度导致的计算错误。

根据测试可知,通项公式法只在理论上可行,没有操作性。

defFibonacci(n):

sqrt5= 5 ** 0.5ans= (((1 + sqrt5) / 2) ** n - (((1 - sqrt5) / 2) ** n)) /sqrt5return round(ans)

方法四:矩阵法

主要原理是以下公式和快速幂算法

这种算法是求任意线性常系数递归递推关系的任意项的通用解法,而且通常也是最优解

时间复杂度O(log n),空间复杂度O(log n)(由递归深度决定)

计算Fibonacci(10)十次平均用时0.0002s    计算Fibonacci(100)十次平均0.0003s    计算Fibonacci(10000)十次平均0.0008s    计算Fibonacci(1000000)十次平均0.184s

可以看出当n较大时,矩阵法明显优于动态规划法

另外,在这个方法中,使用了Strassen算法算法计算矩阵的乘法(该算法可以使得两个大小为n的方朕相乘的时间复杂度由传统的O(n ^ 3)下降到O(n ^ 2.81))

同时在快速幂算法中使用了一定的位运算技巧以达到最优化的性能

(笔者同时测试了把快速幂的递归算法换成非递归算法,非递归算法的时间大概是递归算法的两倍)

defMatrix_Multiply(matrix1, matrix2):

a, b, c, d= matrix1[0][0], matrix1[0][1], matrix1[1][0], matrix1[1][1]

e, f, g, h= matrix2[0][0], matrix2[0][1], matrix2[1][0], matrix2[1][1]

p1= a * (f -h)

p2= (a + b) *h

p3= (c + d) *e

p4= d * (g -e)

p5= (a + d) * (e +h)

p6= (b - d) * (g +h)

p7= (a - c) * (e +f)

r= p5 + p4 - p2 +p6

s= p1 +p2

t= p3 +p4

u= p5 + p1 - p3 -p7return[[r, s], [t, u]]defMatrix_Quick_Pow(matrix, p):if p == 1:returnmatrixif p & 1:

temp= Matrix_Quick_Pow(matrix, p >> 1)returnMatrix_Multiply(Matrix_Multiply(temp, temp), matrix)else:

tmp= Matrix_Quick_Pow(matrix, p >> 1)returnMatrix_Multiply(tmp, tmp)defFibonacci(n):

matrix= [[1, 1], [1, 0]]return Matrix_Quick_Pow(matrix, n)[0][1]

python计算第n个斐波那契数_计算第n个斐波那契数相关推荐

  1. 数字拆分为斐波那契数列_检查数字是否为斐波那契

    数字拆分为斐波那契数列 Description: 描述: We are often used to generate Fibonacci numbers. But in this article, w ...

  2. python计算多边形的面积并保留两位小数_计算任意多边形面积的Python实现

    最近需要实现一个计算非凸多边形面积的功能,需要输入是顺次排序的多边形顶点坐标,假设输入的多边形顶点是V={v0, v1, v2, -, vn-1},则多边形的边为E={, , ,...,, }.要求输 ...

  3. 循环斐波那契数列_第五课:斐波那契数列(第一课时)

    简介:又称黄金分割数列.因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:1.1.2.3.5.8.13.21.34--在数学上,斐波那契数 ...

  4. 用循环实现斐波那契数列_剑指 Offer 10- I. 斐波那契数列

    剑指 Offer 10- I. 斐波那契数列 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F ...

  5. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

  6. c语言斐波那契数列_视频丨神奇的斐波那契数列科学性与艺术性

    生命是奇妙的 生命是有生命的 斐波那契数列 Fn+1=Fn+Fn-1,这个数列中的每个数字都是前两项数之和,如果是以1,1开头的自然数数列,1,1,2,3,5,8,13,21,34,55,89--这些 ...

  7. python平方数_计算范围内的平方数(python)

    你可以用(n + 1)**2 == n**2 + (2*n + 1) 以下是如何使用生成器函数来完成此操作: ^{pr2}$ 输出[4, 9, 16] [9, 16, 25, 36, 49] [25, ...

  8. python中100能被7整除的数_计算1~100之间,能被3整除但是不能被7整除的数的和(C语言)...

    IOS开发之Bug--使用KVC的易错情况 1.其实某些角度而言KVC是一个破坏封装又暴力的做法,而我已经两次因为KVC而导致应用程序出现闪退的情况. 场景:1.使用KVC修改某一个UIView的属性 ...

  9. MySQL计算表行数_计算MySQL表中行数的最快方法?

    让我们首先来看一个创建表,添加记录并显示它们的示例.CREATE命令用于创建表.mysql> CREATE table RowCountDemo -> ( -> ID int, -& ...

最新文章

  1. javascript如何实现功能的分析
  2. fastReport 随记
  3. Java基础学习总结(20)——基础语法
  4. 高级语言的编译:链接及装载过程介绍
  5. python中的捕获异常、异常跟踪
  6. DeepMind发布Sonnet 帮你用TensorFlow快速搭建神经网络
  7. iBATIS In Action:使用映射语句(二)
  8. java 单例模式打包jar_在 Spark 中实现单例模式的技巧
  9. 支付宝沙箱环境下模拟下单流程
  10. easyui 图标下拉框
  11. 视觉机器学习20讲-MATLAB源码示例(13)-稀疏表示算法
  12. 运算放大器权威指南(第三版)
  13. 软件设计原则之单一职责原则
  14. 微信8.0下载(可抓包)
  15. 网站友情链接交换的方法
  16. 怎么用计算机算组合数c,排列组合c怎么算 公式是什么
  17. 人工智能--打飞机游戏
  18. html中文字不自动换行 white-space style
  19. 找不到实时聊天软件?给你推荐电商企业都在用的!
  20. 南京大学计算机技术是重点学科吗,2019南京大学重点学科和重点专业大盘点

热门文章

  1. ESP32-C3把4*4矩阵键盘数据传输到OLED显示屏上
  2. CAS基础及底层原理
  3. 使用计算机是怎样绝对引用,办公小技巧:Excel引用相对还是绝对
  4. 20周年精彩盛宴将至 全球聚焦新能源展
  5. matlab 最少拍控制器 计算 阶跃,基于Matlab 的最少拍控制系统设计
  6. linux arpspoof命令,Arpspoof的具体使用
  7. MATLAB实现基于BP网络的个人信贷信用评估
  8. 甲骨文发布业界最全面的云分析产品
  9. 【Ubuntu】在windows下远程访问ubuntu桌面
  10. redis主从集群搭建及容灾部署(哨兵sentinel)