Fibonacci sequence两种实现算法及其复杂度分析

来源:互联网 发布:淘宝如何查看累计消费 编辑:程序博客网 时间:2024/06/03 17:59

定义Fibonacci问题:f(0) = f(1) = 1; 对于n≥2,f(n) = f(n - 1) + f(n - 2)

|递归实现

最简单的实现方式是使用递归算法,然而这种方法的时间复杂度较大。

int Fib1(int n){    if(n < 2) return 1;    else return Fib1(n-1)+Fib1(n-2);}

时间复杂度的关系式为T(n)=T(n1)+T(n2),这种递归式的时间复杂度计算用常规方法无法求得,需要通过解二阶线性齐次差分方程来得出时间复杂度。
推导如下:

特征方程为x2x1=0
解得这个一元二次方程的解为:x=(1±52)
因而T(n)的通解为T(n)=c1(1+52)n+c2(152)n
代入T(0)=T(1)=1求得c1=1+(15)2,c2=1(15)2
于是得到最后的时间复杂度为T(n)=1+(15)2(1+52)n+1(15)2(152)n

|非递归算法

如果说递归是由上往下求解,非递归的思想就是由下往上,从F(2)=F(1)+F(0)开始逐层向上求解。采用中间变量a和b逐个累加的思想,迭代最终求出F(n)

int fib2(int n){    if(n < 2) return 1;    else{        int a = 1;        int b = 1;        int c;        while(n > 1)        {            c = a;            a = a + b;            b = c;            n--;        }        return a;    }}

因为只有一层while循环,因此其时间复杂度为O(n)


最后贴出测试代码

#include "stdio.h"int fib1(int n){    if(n < 2) return 1;    else return fib(n-1) + fib(n-2);}int fib2(int n){    if(n < 2) return 1;    else{        int a = 1;        int b = 1;        int c;        while(n > 1)        {            c = a;            a = a + b;            b = c;            n--;        }        return a;    }}int main(){    printf("%d\n",fib1(5));    printf("%d",fib2(8));    return 0; } 

运行结果

8
34

另外还有一种复杂度为Ologn的算法,在下次专题分析。