C++ 确定函数的复杂性(大O表示法)
我在期中考试时遇到了这个问题,我不确定我的答案,答案是O(n^2)。我想要有解释的答案,谢谢C++ 确定函数的复杂性(大O表示法),c++,recursion,big-o,C++,Recursion,Big O,我在期中考试时遇到了这个问题,我不确定我的答案,答案是O(n^2)。我想要有解释的答案,谢谢 int recursiveFun1(int n) { for(i=0;i<n;i+=1) do something; if (n <= 0) return 1; else return 1 + recursiveFun1(n
int recursiveFun1(int n)
{ for(i=0;i<n;i+=1)
do something;
if (n <= 0)
return 1;
else
return 1 + recursiveFun1(n-1);}
intrecursivefun1(intn)
{对于(i=0;i用R(n)
表示该递归函数对输入n
的执行时间。然后,如果n
大于0,则执行以下操作:
n
times做某事
-假设“某物”的运行时间恒定,它会消耗c1*n
时间
- 各种检查和记账工作-固定时间
c2
- 计算输入
n-1
-一次。其运行时间为R(n-1)
(根据定义)
所以
这个方程有一个解,它是O(n^2)
。你可以通过归纳法来证明它,或者仅仅通过猜测a*n^2+b*n+c
形式的解来证明它
注意:我假设“做某事”有恒定的运行时间。这似乎是合理的。但是,如果它不是真的(例如,它包含一个递归调用),那么您的复杂性将更大-可能更大,这取决于“某事”在做什么。首先,我将代码放入另一个缩进
int recursiveFun1(int n)
{
for(i=0;i<n;i+=1) // this is bounded by O(n)
do something; // I assume this part is O(1)
if (n <= 0)
return 1;
else
return 1 + recursiveFun1(n-1);
}
intrecursivefun1(intn)
{
对于(i=0,InPopy,首先你的方法)和“我想要答案解释”听起来很粗鲁。注意你的语言。你的标题是“大O”,但是在你的文本中,你使用的是一个小写的“O”。注意,请精确。此外, > do/Cuth>是C++中引入一个循环的一个关键词。如果你写了“代码> dothOnththin”,那就更清楚了。
相反。令人印象深刻的是,你甚至懒得合理地格式化代码。答案是O(n^2),除非do something
中的something
不是O(1)。这个递归让我想起了双嵌套for循环,无论如何,你可以验证它确实是O(n^2)通过绘制递归树,或者你可以说这个函数做线性工作,它被调用了n次,这导致了o(n^2)。很好的答案,向上投票。
int recursiveFun1(int n)
{
for(i=0;i<n;i+=1) // this is bounded by O(n)
do something; // I assume this part is O(1)
if (n <= 0)
return 1;
else
return 1 + recursiveFun1(n-1);
}