斐波那契数列是一个很有意思的数列,应用领域非常广.
定义:
F(n+1)=F(n) + F(n-1)
有意思的是, F(n) / F(n+1) 趋于黄金分割 0.618.如何计算斐波那契数呢? 最朴素的思想,利用定义.
算法1代码如下:
static int Fibonacci1(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
return Fibonacci1(n - 1) + Fibonacci1(n - 2);
}
分析下算法复杂度:
T(n+1) = T(n) + T(n-1) = 2 * T(n-1) + T(n-2) = … = F(n) + F(n-1) = F(n+1)
由于直接递归调用, 结果中的每一个1都来自最底层的F(1)和F(2),
那么为了求第n个数,就要调用F(n)次函数.
由于斐波那契数列是指数增长,所以该算法的时间复杂度也是指数增长,即O(2^n)
仔细想下,从头开始往后算,也不过是线性复杂度,比算法1好太多了.
于是得到算法2:
static int Fibonacci2(int n)
{
int[] a = new int[n];
a[0] = 1;
a[1] = 1;
for