549 字
1 分钟
斐波那契数列及程序撰写
斐波那契数列是我最早接触的”有实际意义的数列”之一 —— 它不只是数学题,在大自然和计算机科学里到处都能看到它的影子。
什么是斐波那契数列?
从 0 和 1 开始,后面每个数都是前两个数之和:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...递推关系很简单:
斐波那契数列具有如下的形式:
(有些定义里 F(0)=1, F(1)=1,我习惯用上面这套,跟 LeetCode 统一。)
常见用途
- 自然界:向日葵的螺旋排列、贝壳的螺线、树枝分叉,很多都跟斐波那契数有关
- 算法题:爬楼梯问题、兔子繁殖问题、矩形覆盖问题,本质都是斐波那契
- 黄金分割:相邻两项比值趋近于 1.618,也就是黄金分割比 φ
- 搜索算法:斐波那契搜索,类似二分查找但用斐波那契数分割
通项公式(比奈公式)
这公式看着唬人,但推导出来挺有意思的:
平时写代码基本用不上,因为浮点数有精度问题,但理解它有助于理解线性递推的求解思路。
矩阵表示
把递推写成矩阵形式,可以用矩阵快速幂在 O(log n) 时间内算出第 n 项:
递推下去就是:
代码实现对比
朴素递归(指数级,千万别用)
def fib(n): if n <= 1: return n return fib(n-1) + fib(n-2)这个不做任何优化的话,n=50 就等到天荒地老了。问题在于大量重复计算——fib(5) 要算好几次。
迭代(推荐,O(n) 时间,O(1) 空间)
def fib(n): if n <= 1: return n a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b矩阵快速幂(O(log n),面试加分项)
import numpy as np
def fib(n): if n <= 1: return n base = np.array([[1, 1], [1, 0]], dtype=object) result = np.linalg.matrix_power(base, n - 1) return result[0, 0]小结
斐波那契数列是个很好的”从小见大”的例子——从简单的递推出发,可以引出递归优化、矩阵运算、甚至生成函数这些更深的数学工具。面试的时候遇到爬楼梯之类的问题,能快速想到斐波那契就已经赢了一半。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
相关文章 智能推荐






