求解斐波那契数列的时间复杂度,分别用递归和非递归方法

如题所述

Fibonacci数列
无穷数列1,1,2,3,5,8,13,21,34,55,···,称为Fibonacci数列。它可以递归的定义为
1 n=0
F(n)= 1 n=1
F(n-1)+F(n-2) n>1
第n个Fibonacci数可递归地计算如下:
int Fibonacci ( intn)
{
If(n<=1)return 1;
ReturnFibonacci(n-1)+Fibonacci(n-2);
}
1+T(n-1)+T(n-2) n>1
Tn=
0 n<=1

时间复杂度为指数时间O(kn)

非递归计算如下:
Int Fibonacci(int n)
{
If(n<2)return 1;
else{
int a=b=1;
for(int i=0;i<n+2;i++)
{
b=a+b;
a=b-a;
return a+b;
}
}
}
时间复杂度为O(n).
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-08-07

转一个牛人的博客,链接:https://www.jianshu.com/p/91b47e5f333b;
讲的很清楚,递归可以近似为二叉树,非递归是for循环,这里防止博客过期,就crtl+c+v了= =;

function fibonacci(n) {     
    if (n <= 1) {          
        return n;     
    }     
    return fibonacci(n-1) + fibonacci(n-2); 
}

针对递归方法的教学,斐波那数列可能是最常用来拿来举例的了;
但是,实际计算时绝不推荐使用递归方法,很容易stack overflow;
可以在浏览器中计算个fibonacci(100)试试。而且其时间复杂度为指数级,可以近似认为是2^n, 当然准确点可能是1.6^n;

其时间复杂度的计算: 递推关系式为f(n)=f(n-1)+f(n-2);
显然是一个2阶常系数查分方程,其特征方程为x^2-x-1=0;
得其解x, 时间复杂度为O(1.618^n);

或者另一种思路: 该方法的递归求解过程其实就是其二叉树展开的过程,时间复杂度就是计算该二叉树的节点个数: 树高n层, 但不是满二叉树,忽略常数,是O(2^n)

将递归展开,以循环方式计算

function fibonacci(n) {
    if (n <= 1) {
            return n;
   }
       let one = 0;
       let two = 1; 
       let res;
       for (let i = 2; i <= n; i++){
           res = one + two;
           one = two;
           two = res;
   }    
   return res;
}

事件复杂度为O(n)

作者:RichardBillion
链接:https://www.jianshu.com/p/91b47e5f333b
来源:简书

第2个回答  推荐于2017-07-26
这是递推算法又不是排序算法,就一个公式有什么时间复杂度,扯淡了本回答被网友采纳
第3个回答  2015-05-03
这是递推算法又不是排序算法,就一个公式有什么时间复杂度,扯淡了本回答被提问者和网友采纳

求解斐波那契数列的时间复杂度,分别用递归和非递归方法
时间复杂度为O(n).

斐波那契数列两种算法的时间复杂度
求解斐波那契数列的F(n)有两种常用算法:递归算法和非递归算法。试分析两种算法的时间复杂度。时间复杂度分析:求解F(n),必须先计算F(n-1)和F(n-2),计算F(n-1)和F(n-2),又必须先计算F(n-3)和F(n-4)。。。以此类推,直至必须先计算F(1)和F(0),然后逆推得到F(n-1)和F(n-2)的...

斐波那契数列解题技巧
第一种解法:递归法。利用C++求解斐波那契数列第N项数字是什么?我们可以用C++算法归法来进行表示,我们知道,斐波那契数列的每一项数字都等于前面两项数字之和,那么用计算机函数来表示,若fun为求斐波那契数列的第N项的函数,那么fun(N)=fun(N-1)+fun(N-2)。第二种解法(记忆化递归\/动态规划):第一种...

咱把递归算法的时间复杂度和空间复杂度讲清楚!
那么每次递归的空间复杂度是O(1),调用栈深度为n,所以这段递归代码的空间复杂度就是O(n)。最后对各种求斐波那契数列方法的性能做一下分析,如题:可以看出,求斐波那契数时,使用递归算法并不一定是在性能上是最优的,但递归确实简化了代码层面的复杂度。带大家再分析一段二分查找的递归实现。都知道...

斐波那契数列的通项公式有什么简单的推导方式?
初始时,dp[0]=0,dp[1]=1。然后,我们可以使用以下递推关系式来计算dp[i]:dp[i]=dp[i-1]+dp[i-2]通过不断地更新dp数组,我们可以高效地计算出斐波那契数列的第n项。这种方法的时间复杂度为O(n),比递归方法要快得多。除了动态规划方法,还有其他一些高效的算法来计算斐波那契数列,例如...

第一张图中画波浪线的地方,这个时间时间复杂度是怎么推出来的呢?我在...
2n − 1 次(其中n为第n个斐波那契数),每次递归调用需要进行一次加法运算,所以时间复杂度为O(2^n)。需要注意的是,由于斐波那契数列递归算法的指数级时间复杂度,算出非常大的值会需要很长的时间,甚至会引起栈溢出。因此,在实际应用中,需要使用其他的算法来实现斐波那契数列的计算。

递归优化的斐波那契数列
该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。如: 1 1 2 3 5 8 .. 计算公式: F(N) = F(N - 1) + F(N - 2) (N > 1)尾递归:尾调用的一种特殊情况,特别的是尾递归在最后一步 调用自身 。非尾递归Fibonacci序列实现如下:尾递归优化的Fibonacci序列实现...

Fibonacci数列高效解法大全及时间复杂度分析 连载【3】
如之前所说,斐波那契数列的典型递归解法时间复杂度为O(1.618 ^ n),耗时指数式快速上升,没有实用价值 仔细看递归调用过程会发现,Calculate_Fibonacci_sequence(n-1) + Calculate_Fibonacci_sequence(n-2),这二元递归过程会有很多重复性中间结果 那么在递归过程中把得到中间结果用字典保存起来,每当...

面试题精选:神奇的斐波那契数列
讨论到斐波那契数列的求解方式,我们首先考虑递归方法,这种方法直观,基于数学定义,但效率低下,存在大量重复计算。对于求解第n项,递归时间复杂度接近于O(2^n)。然而,通过记忆化搜索优化递归过程,可以将时间复杂度优化至O(n),避免重复计算的浪费。接下来,我们探索迭代方法,这种方法从前往后逐步计算,...

斐波那契数列相关问题精讲
斐波那契数列的递推定义方式如下:公式 问题一:求斐波那契数列的通项公式,有以下几种方法:方法1:待定系数法构造满足等比的新数列 方法2:利用差分方程理论求解 方法3:矩阵幂法 方法4:生成函数(generating function),也称为母函数法 以斐波那契数列通项为例,逐一展示以上方法 方法1:公式 待定系数...

相似回答