以下伪代码的计算复杂度是什么?
integer recursive (integer n) {
if (n == 1)
return (1);
else
return (recursive (n-1) + recursive (n-1));
}
在现实世界中,调用将得到优化并产生线性复杂性,但是对于计算了大哦的RAM模型,复杂性会是多少?的 2 ^ N
答案 0 :(得分:2)
这种算法在当前形式下的复杂性确实是O(2 n ),因为在每个呼叫级别上,呼叫次数会增加两倍。
第一个呼叫(递归(n))构成一个呼叫
下一级(递归(n-1))构成2次调用
在基本情况下(递归(1)),它构成2个 n-1 调用。
所以函数调用的总数是1 + 2 + ... + 2 n-1 = 2 n -1
因此复杂性为O(2 n )。
其他要点:
正如你所说的那样,通过记忆或动态编程,可以很容易地得到O(n)(或者对于使用快速取幂的这种特殊情况,可能是O(log n))。
答案 1 :(得分:2)
您的复杂性将为
为什么会这样?只需mathematical induction证明:
N=K
正确,即N=K
N=K+1
。函数recursive
将递归调用N=K
两次:recursive(K+1) = recursive(K) + recursive(K)
,因为它来自代码。那就是:。因此,对于N=K+1
,我们获得了个步骤。 因此,我们已经证明N
的复杂性在常见情况下为(来自数学归纳的定义)。