关于斐波那契函数
斐波那契函数$F(N)$是由斐波那契数列得到,该数列从$0$和$1$开始,之后的每一项都由前两项相加得到,即有
对斐波那契函数求值,就是给定一个N
值,返回$F(N)$的值。
递归法
- 检查
N
的值,如果N <= 1
,则将N
的值返回。 - 若
N > 1
,则通过调用$N=F(N-1)+F(N-2)$来递归,最终返回N
的值。
C++
代码实现如下:
1 | int fib(int N) { |
时间复杂度:$O(2^n)$.
这是计算斐波那契函数最慢的一种方法,但其实现起来比较方便,也更容易想到。
空间复杂度:$O(n)$.
为了跟踪
fib
函数的调用,我们需要与N
成正比的空间大小。
自下而上迭代
- 若
N <= 1
,返回N
的值。 - 迭代至
N
,将各个计算得到的值存在一个数组里。 - 每次迭代用数组当前位置的前两个数得到当前的数。
- 返回数组中的第
N
个值。
C++
代码实现如下:
1 | int fib(int N) { |
时间复杂度:$O(n)$
迭代了N次。
空间复杂度:$O(n)$
使用了大小为N的数组。
求幂矩阵
我们知道,斐波那契数列矩阵方程为:
通过矩阵求幂即可得到$F(N)$的值。
- 若
N <= 1
,返回N
的值。 - 计算
{[1, 1], [1, 0]}
的N - 1
次方得到的矩阵。 - 由于该矩阵乘以
{[1], [0]}
后,第一个元素就是$F(N)$的值,所以返回。
C++
代码实现如下:
1 | int fib(int N) { |
- 时间复杂度:$O(logN)$.
- 空间复杂度:$O(logN)$.
黄金分割比
Binet公式求斐波那契数列的第$n$项时用到了黄金分割比$\varphi$。
- 直接使用Binet公式计算$F(N)$的值。
C++
代码实现如下:
1 | int fib(int N) { |
时间复杂度:$O(1)$.
没有使用任何迭代或者递归。
空间复杂度:$O(1)$.
参考
【1】Leetcode斐波那契数.