Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 特定递归函数的增长阶_C#_Math_Recursion_Big O - Fatal编程技术网

C# 特定递归函数的增长阶

C# 特定递归函数的增长阶,c#,math,recursion,big-o,C#,Math,Recursion,Big O,以下函数的增长顺序是什么 static int counter = 0; static void Example(int n) { if (n == 1) return; for (int i = 0; i < n; i++) { counter++; } Example(n / 2); } 通过分析,我能够判断出该方法的增长顺序为对数基数2/n

以下函数的增长顺序是什么

    static int counter = 0;

    static void Example(int n)
    {
        if (n == 1) return;

        for (int i = 0; i < n; i++)
        {
            counter++;
        }

        Example(n / 2);
    }
通过分析,我能够判断出该方法的增长顺序为对数基数2/n


所以我认为最终的答案将是log base 2乘以其他值。我怎么才能知道呢?

现在让我们看看。。这将向计数器添加1 n次。 每次呼叫n减少一半,直到达到1为止

您可以去掉循环并使用

counter+=n;
相反,因为循环基本上是向计数器加n,1乘1

这意味着每次运行计数器时,n都会被加到计数器中,然后变小2,直到达到1为止

所以说n=40。 柜台: 40 -> 60 -> 70 -> 75 -> 77 -> 77. n: 40->20->10->5->2->1


只要往正确的方向推一下(计数器+=n;是重要的部分)

让我们看看原始函数和修改后的函数。在原始函数中,您完成了以下工作量:

  • 基本情况检查的恒定工作量
  • O(n)计算数字
  • 对一半大小的对象进行递归调用所需的工作
我们可以将其表示为递归关系:

  • T(1)=1
  • T(n)=n+T(n/2)
让我们看看这是什么样子。我们可以通过注意到

T(n)=n+T(n/2)

=n+(n/2+T(n/4)

=n+n/2+T(n/4)

=n+n/2+(n/4+T(n/8))

=n+n/2+n/4+T(n/8)

我们可以在这里看到一个模式,如果我们把T(n/2)位扩展k倍,我们得到

T(n)=n+n/2+n/4+…+n/2k+T(n/2k)

最终,当n/2k=1时,这个过程停止

T(n)=n+n/2+n/4+n/8+…+1

这算什么?有趣的是,这个和等于2n+1,因为和n+n/2+n/4+n/8+…=2n。因此,第一个函数是O(n)。我们也可以通过使用得出这个结论,但看到这个方法也很有趣


现在让我们看看新函数,这个函数

  • 基本情况检查的恒定工作量
  • 对一半大小的对象进行递归调用所需的工作
我们可以把这个循环写成

  • T(1)=1
  • T(n)=1+T(n/2)
使用与前面相同的技巧,让我们展开T(n):

T(n)=1+T(n/2)

=1+1+T(n/4)

=1+1+1+T(n/8)

更一般地说,在扩展k次之后,我们得到

T(n)=k+T(n/2k)

当n/2k=1时停止,当k=log2n(即lgn)时停止

T(n)=lgn+T(1)=lgn+1

在这种情况下,T(n)=O(lgn)


希望这有帮助!

那么增长的顺序将等于什么?我实际上需要找到该算法的增长顺序,而不是它将被执行的次数…感谢您的帮助。在这种情况下,templaetypedev的答案正是您需要的,很抱歉误解了这个问题。这意味着它具有相同的顺序没有内部for循环的相同方法的增长?这很有趣。非常感谢您的帮助help@TonoNam-我想你误读了我的答案。内部for循环实际上使代码的速度呈指数级下降——没有循环是O(logn),有循环是O(n).我真的很喜欢templatetypedef的解释。@templatetypedef Upvote,因为它解释得这么漂亮:)
counter+=n;