mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
549 字
1 分钟
斐波那契数列及程序撰写
2025-11-09
2026-06-02

斐波那契数列是我最早接触的”有实际意义的数列”之一 —— 它不只是数学题,在大自然和计算机科学里到处都能看到它的影子。

什么是斐波那契数列?#

从 0 和 1 开始,后面每个数都是前两个数之和:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

递推关系很简单:

斐波那契数列具有如下的形式:

F(0)=0,F(1)=1,F(n)=F(n1)+F(n2) (n2)F(0)=0,\quad F(1)=1,\quad F(n)=F(n-1)+F(n-2)\ (n \geq 2)

(有些定义里 F(0)=1, F(1)=1,我习惯用上面这套,跟 LeetCode 统一。)

常见用途#

  • 自然界:向日葵的螺旋排列、贝壳的螺线、树枝分叉,很多都跟斐波那契数有关
  • 算法题:爬楼梯问题、兔子繁殖问题、矩形覆盖问题,本质都是斐波那契
  • 黄金分割:相邻两项比值趋近于 1.618,也就是黄金分割比 φ
  • 搜索算法:斐波那契搜索,类似二分查找但用斐波那契数分割

通项公式(比奈公式)#

这公式看着唬人,但推导出来挺有意思的:

F(n)=15[(1+52)n(152)n]F(n)=\frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n\right]

平时写代码基本用不上,因为浮点数有精度问题,但理解它有助于理解线性递推的求解思路。

矩阵表示#

把递推写成矩阵形式,可以用矩阵快速幂在 O(log n) 时间内算出第 n 项:

[F(n)F(n1)]=[1110][F(n1)F(n2)]\begin{bmatrix} F(n) \\ F(n-1) \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} F(n-1) \\ F(n-2) \end{bmatrix}

递推下去就是:

[F(n)F(n1)]=[1110]n1[10]\begin{bmatrix} F(n) \\ F(n-1) \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}^{n-1} \begin{bmatrix} 1 \\ 0 \end{bmatrix}

代码实现对比#

朴素递归(指数级,千万别用)#

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]

小结#

斐波那契数列是个很好的”从小见大”的例子——从简单的递推出发,可以引出递归优化、矩阵运算、甚至生成函数这些更深的数学工具。面试的时候遇到爬楼梯之类的问题,能快速想到斐波那契就已经赢了一半。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

部分信息可能已经过时

目录