Time complexity 这个递归斐波那契的大O时间复杂度?

Time complexity 这个递归斐波那契的大O时间复杂度?,time-complexity,big-o,complexity-theory,asymptotic-complexity,code-complexity,Time Complexity,Big O,Complexity Theory,Asymptotic Complexity,Code Complexity,我有一个程序,使用递归打印斐波那契数列。有更好的方法,但我被要求使用递归,所以我不得不这样做 节目如下: #include <stdio.h> #define TERMS 10 long fibo(int); int main(void){ for(int i = 1; i <= TERMS; i++) { printf("%ld", fibo(i)); } return 0; } long fibo(int n){ if (n &

我有一个程序,使用递归打印斐波那契数列。有更好的方法,但我被要求使用递归,所以我不得不这样做

节目如下:

#include <stdio.h>
#define TERMS 10

long fibo(int);

int main(void){
   for(int i = 1; i <= TERMS; i++) {
       printf("%ld", fibo(i));
   }
   return 0;
}

long fibo(int n){
    if (n < 3) {
        return 1;
    }
    else {
        return fibo(n - 1) + fibo(n - 2);
    }
}
#包括
#定义术语10
长fibo(int);
内部主(空){
对于(int i=1;i
c(fibo(n))=c(fibo(n-1))+c(fibo(n-2))+O(1)

请注意,由于所有计算分支始终以值为1的叶结束,因此精确(θ)复杂性可以通过斐波那契级数本身的闭合公式精确计算,因此复杂性遵循级数的精确公式

但这超出了你的问题范围,我们需要注意的是

c(fibo(n))<2*c(fibo(n-1))

我们现在所需要的就是求解由

an=2*an-1(a1,2=1)

导致

an=2^n

所以,你得到了你想要的2^n的上界O

如果你运行几次,你会得到

σ(c(fib(n))从1到项=O(2^(项+1)-1)

这是一个简单的数学事实,这意味着在你的情况下(术语=10),你得到

2^11-1=2047


至于你的问题,关于一个更好的方法来做这个递归

int fib(int n, int val = 1, int prev = 0)
{
    if (n == 0) {
        return prev;
    }
    if (n == 1) {
        return val;
    }
    return fib(n - 1, val + prev, val);
}

这就是所谓的尾部递归,取O(n)(事实上,一个好的编译器可以将其优化为一个循环,然后还将消耗恒定的内存消耗)

一般来说,它背后有数学基础,斐波那契解释如下:

如果你不需要证明它,只需要正确地写下来,你只需要考虑算法的行为以及某个数字的重复次数,然后你就可以尝试将它推广到任何输入
n

纸是你的朋友

如果在递归中有值为“10”的斐波那契,基本上就是说(10的斐波那契是9的斐波那契+8的斐波那契)

然后对于斐波那契9,你说-它是斐波那契8+斐波那契7等等

您可以绘制图形:

我认为很明显,它将继续成为一个几乎完整的二叉树。你可以看到,对于每一个级别,节点的数量都是原来的两倍,因此对于
fib(10)
,它将在底部重复10次,几乎
2^10
,因此对于
fib(n)
它将是
2^n

如何使其在递归alghoritm中有效?从图中可以看出,fib(7)被解了三次。因此,一旦计算出fib(n),就必须记住它。它可以是全局变量,也可以通过递归调用传递对对象的引用


然后你不只是说“fib(n-1)和fib(n-2)”,你首先看“fib(n-1)计数了吗?”如果是这样,用计算值代替递归。

产生斐波那契数列的递归函数生成一个高度为n的二叉树。假设我们取n=5。那么树结构如下:

在最底层,我们将得到大约2^n个节点,因此时间复杂度将在O(2^n)左右,因为递归将对每个叶节点重复


我们可以通过使用内存化的动态编程方法大大改进这一点,它基本上是将重复的子问题(如示例中的
fib(2)
fib(3)
)存储在某种查找表中。这将时间复杂度降低到O(n)。

我认为递归Fibbonaci大约是O(n^6)正如直接计算所示,它的最高项是n^6,但我无法检查。可能是从哪里得到n^6的重复项?!它是指数的,因为计算所需的时间与值一样长(所有递归分支都以值为1的叶子结束),我认为是从比奈的公式:)@DragonthoughtsPlease重新格式化。它一点也不好看,也不容易理解。而且我想要它是为了完整的程序,而不仅仅是fibo(n),因为它位于另一个循环中,用于其他用途?如果在特斯拉GPU上运行,您是否希望我计算以卡路里为单位的功耗?您应该在我要求完整程序时阅读这个问题。不仅仅是fibo(n)。我从未要求从1到n的sigma(2^n)是2^(n+1)-1,因此总数是2^11-1