趣学算法之斐波拉契数列实现

1、斐波拉契数列

f(1) = 1; f(2) = 1; f(3) = f(1) + f(2);以此内推


       1                           x = 1
f(x) = 1                           x = 2
       f(x - 1)  + f(x - 2)        x >= 3




2、代码实现

#include 
#include 

int fib1(int n)
{
    if (n <= 0)
        return -1;
    else if (n == 1 || n == 2)
        return 1;
    else
        return fib1(n - 1) + fib1(n - 2);
}

int fib2(int n)
{
    if (n <= 0)
        return -1;
    int *a = malloc(sizeof(int) * n); //开辟了一个数组
    a[1] = 1;
    a[2] = 1;
    for (int i = 3; i <= n; ++i)
    {
        a[i] = a[i - 1] + a[i - 2];
    }
    return a[n];
}

int fib3(int n)
{
    if (n <= 0)
        return -1;
    int a1 = 1;
    int a2 = 1;
    //不要忘记n为1和为2的情况
    if (n == 1 || n == 2)
        return 1;
    //不要忘记这里是i <= n,不是 i < n,切记
    for (int i = 3; i <= n; ++i)
    {
        //保存最后一项
        a2 = a1 + a2;
        //保存最后一项的前一项
        a1 = a2 - a1;
    }
    return a2;
}

int main()
{
   printf("fib1(5) is %d\n", fib1(5));
   printf("fib2(5) is %d\n", fib2(5));
   printf("fib3(5) is %d\n", fib3(5));
   return 0;
}






4、运行结果

1111deMacBook-Pro:happyArithmetic a1111$ vim fib1.c
1111deMacBook-Pro:happyArithmetic a1111$ gcc -g fib1.c -o fib1
1111deMacBook-Pro:happyArithmetic a1111$ ./fib1
fib1(5) is 5
fib2(5) is 5
fib3(5) is 5







5、分析

fib1函数我们用递归,我们知道递归很消耗内存空间,我们先看斐波拉契数列的通项公式
http://blog.csdn.net/u011068702/article/details/78948145
当n趋向无穷的时候,时间复杂度是指数街的,然后我们为了减少时间复杂度,fib2充分利用了数组,这个时候
我们时间复杂的只有O(n),只不过空间复杂度O(n),
然后我们是否可以把空间复杂度去掉呢?当然可以,我们用之前的变量保存我们需要的数据,然后纪录我们需要的就可以了,
 fib(3)我么时间复杂度为O(n),然后空间复杂度为O(1).





6、总结

 递归实现一般时间复杂度很大,我们优化可以用数组,如果用数组增加了空间复杂度,我们可以之前的变量的我们需要的数据,从而降低空间复杂度

你可能感兴趣的:(趣学算法)