斐波那契数列求解以及时间空间复杂度分析

1 斐波那契数列定义 

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……

在数学上,斐波纳契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 

2 斐波那契数列求解

2.1 递归求解

    //递归求解
    public static int solveFibonacciByRE(int n){
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        return solveFibonacciByRE(n-1)+solveFibonacciByRE(n-2);
    }

时间复杂度分析:递归的总次数*每次递归的数量

空间复杂度分析:递归的深度*每次递归创建变量的个数 

 斐波那契数列求解以及时间空间复杂度分析_第1张图片

空间复杂度:

在上述递归调用过程中,要想求得Fib(5),需要先求得 Fib(4)与Fib(3),依次重复调用

因此,调用的总次数为:2^n-1(二叉树的最多结点数),每次递归调用的时间可看为常数时间,所以空间复杂度为O(2^{n})

时间复杂度:

递归的深度为二叉树的深度n, 所以空间复杂度为O(n)

 2.2 非递归求解

    //动态规划
    public static int solveFibonacciByDP(int n){
        int result[]=new int[n+1];
        result[1]=1;
        for(int i=2;i<=n;i++){
            result[i]=result[i-1]+result[i-2];
        }
        return result[n];
    }

时间复杂度:

循环次数为n,所示时间复杂度为O(n)

空间复杂度:

没有产生额外的空间开销,所以为O(1)

 

 

你可能感兴趣的:(数据结构)