斐波那契数列定义
Fibonacci array:1,1,2,3,5,8,13,21,34,...
在数学上,斐波那契数列是以递归的方法来定义:
- F(0) = 0
- F(1) = 1
- F(n) = F(n-1) + F(n-2)
用文字描述,就是斐波那契数列由0和1开始,之后的斐波那契系数就是由之前的两数之和想加而得,首几个斐波那契数列系数是:0,1,1,2,3,5,8,13,21,34,55,...特别指出:0不是第一项,而是第零项。
递归解法
最容易想到的解法是按照公式的递归解法,具体实现如下:
int fib(int n) {
if (n < 2) return n;
return fib(n-1) + fib(n-2);
}
但其实该递归解法会重复两次计算 fib(n-2) 项,时间数量级远远超过 n,是指数级别的增长,时间复杂度很高,如下图所示,更因递归调用占用大量的堆栈空间,对程序而言是一场灾难。所以该种解法如果在面试中肯定是不能让面试官满意的。

顺序求和法
按照公式定义前开始的两项 a 和 b 为 0 和 1。后一项 c 是前两项之和,并且 a 和 b重新赋值,动态向右移动,时间复杂度为 O(n)。这种解法非常优秀!
int fib(int n)
{
if (n < 2) return n;
int a = 0;
int b = 1;
int c = 0;
for (int i = 1; i < n; ++i) {
c = a + b;
a = b;
b = c;
}
return c;
}