Big o 递归函数';s运行时 intfoo(intn) { 如果(n==0) 返回1; 整数和=0; 对于(int i=0;i

Big o 递归函数';s运行时 intfoo(intn) { 如果(n==0) 返回1; 整数和=0; 对于(int i=0;i,big-o,recurrence,Big O,Recurrence,我最近在学习大O符号。 有人能告诉我如何使用big-O表示法来确定此递归函数的运行时间,以及如何表示此函数的运行时间。因此,请考虑一下,如果为一个大n运行一个foo(n),会发生什么。然后,总和由对foo的n次调用组成(n-1)。在递归树的下一层中,我们有foo(n-1),我们再次调用n(-1)乘以foo(n-1-1),但是对于树的每个n foo(n-1)分支。我们知道树的高度是n,因为我们必须一直到foo(n-n)。因此,在每个递归步骤中,您都将一个foo实例转换为O(n)个foo实例(n-1

我最近在学习大O符号。
有人能告诉我如何使用big-O表示法来确定此递归函数的运行时间,以及如何表示此函数的运行时间。

因此,请考虑一下,如果为一个大n运行一个foo(n),会发生什么。然后,总和由对foo的n次调用组成(n-1)。在递归树的下一层中,我们有foo(n-1),我们再次调用n(-1)乘以foo(n-1-1),但是对于树的每个n foo(n-1)分支。我们知道树的高度是n,因为我们必须一直到foo(n-n)。因此,在每个递归步骤中,您都将一个foo实例转换为O(n)个foo实例(n-1)


我不确定我是否应该透露答案,因为这似乎是一个练习,但似乎很明显,只要画几层递归树,然后找到你的答案。

因此,想想如果你运行一个foo(n)来获得一个大n会发生什么。然后,总和由对foo的n次调用组成(n-1)。在递归树的下一层中,我们有foo(n-1),我们再次调用n(-1)乘以foo(n-1-1),但是对于树的每个n foo(n-1)分支。我们知道树的高度是n,因为我们必须一直到foo(n-n)。因此,在每个递归步骤中,您都将一个foo实例转换为O(n)个foo实例(n-1)


我不确定我是否应该透露答案,因为这似乎是一个练习,但似乎很明显,只要画几层递归树,然后找到你的答案。

假设n=3,这就是你提到的递归树吗?没有,但很接近。考虑for循环,递归调用sum+=foo(n-1)并不取决于循环变量i。因此,在树的每个节点上,我们分支n次,但每个叶子都被n-1调用。谢谢,我知道了。你解释的很容易理解,假设我假设n=3,这就是你提到的递归树吗?没有,但很接近。考虑for循环,递归调用sum+=foo(n-1)并不取决于循环变量i。因此,在树的每个节点上,我们分支n次,但每个叶子都被n-1调用。谢谢,我知道了。你解释的很容易理解。
int foo(int n)
{
    if(n==0)
        return 1;
    int sum = 0;
    for(int i = 0;i < n;i++)
        sum += foo(n-1);
    return sum;
}