n为此,我们前一天被告知复发关系,我们获得了一些练习代码:
int pow(int base, int n){
if (n == 0)
return 1;
else if (n == 1)
return base;
else if(n%2 == 0)
return pow(base*base, n/2);
else
return base * pow(base*base, n/2);
}
我必须得到它的闭合形式的最远是T(n)= T(n / 2 ^ k)+ 7k。 我不确定如何进一步,因为给我们的例子很简单,并没有那么多帮助。 你如何实际解决这段代码的递归关系?
答案 0 :(得分:1)
我们只计算pow
调用中的乘数,表示为M(N)
,假设它们支配成本(当前强烈无效的假设)。
通过检查代码,我们看到:
M(0) = 0
(N = 0没有乘法)
M(1) = 0
(N = 1没有乘法)
M(N)
,N> 1,N甚至= M(N/2) + 1
(对于偶数N,一次乘法后的递归调用)
M(N)
,N> 1,N奇数= M(N/2) + 2
(对于奇数N,在一次乘法后递归调用,然后是第二次乘法)。
由于它处理偶数和奇数整数的事实,这种复发有点复杂。我们将通过仅考虑偶数或奇数的序列来解决这个问题。
让我们首先处理N
作为2的幂的情况。如果我们迭代公式,我们得到M(N) = M(N/2) + 1 = M(N/4) + 2 = M(N/8) + 3 = M(N/16) + 4
。我们很容易发现模式M(N) = M(N/2^k) + k
,以便解决方案M(2^n) = n
。我们可以将其写为M(N) = Lg(N)
(基数2对数)。
同样,N = 2^n-1
总是会在除以2之后产生奇数。我们有M(2^n-1) = M(2^(n-1)-1) + 2 = M(2^(n-2)-1) + 4... = 2(n-1)
。或M(N) = 2 Lg(N+1) - 2
。
一般N
的确切解决方案可以相当复杂,但我们可以看到Lg(N) <= M(N) <= 2 Lg(N+1) - 2
。因此M(N)
为O(Log(N))
。