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