菲波那切数列在一些场景中很有用. 相信如何计算第n个斐波那契数是一些人接触到的第一个递归算法(尽管他的效率很低). 本篇讲述了如何一步步优化计算fib(n)
本文内容包括:
- 菲波那切数列定义
- 计算斐波那契方法
- 递归
- 循环
- 通项公式
- 矩阵乘法
- 斐波那契方法性能测试
源代码: https://github.com/JasonkayZK/Java_Algorithm/tree/master/src/main/java/algorithm/basic
本文部分内容转自: 斐波那契数列 — 四层优化
如果觉得文章写的不错, 可以关注微信公众号: Coder张小凯
内容和博客同步更新~
斐波那契数列
数学函数定义:
fib(0) = 0, fib(1) = 1;
fib(n) = fib(n - 2) + fib(n - 1) [n > 1]
计算方法
方法1(递归)
1 | /** |
方法2(循环)
1 | /** |
方法3(通项公式)
斐波那契的通项公式为: fib(n) = 1/sqrt(5) * (((1+sqrt(5)) / 2) ^ n - ((1-sqrt(5)) / 2) ^ n
所以有:
1 | /** |
方法4(矩阵乘法实现,最优解)
算法原理:


总结成一句话就是, 可以将求解变为类似于生成快速幂的形式
代码如下:
1 | /** |
代码说明:
声明了一个内部类FibMatrix是一个2x2的数组, 并定义了矩阵乘和矩阵幂
由上面理论分析可知: 通过计算矩阵的快速幂FibMatrix.power(n-1)即可求得fib(n)
斐波那契方法性能测试
比较上面几种方式的性能, 代码如下:
1 | import algorithm.util.iostream.StdOut; |
代码说明:
通过计算fib(50)简单比较几种计算菲波那切数列的方法
assert test(50, res);保证了各方法计算结果的正确性
计算结果:
1 | fibRecursively: (60008 milliseconds) |
可见: 除了递归方法, 其他方法都能保证在以毫秒之内完成计算
附录
源代码: https://github.com/JasonkayZK/Java_Algorithm/tree/master/src/main/java/algorithm/basic
本文部分内容转自: 斐波那契数列 — 四层优化