如何在函数调用自身的次数上建立big-O上限,作为以下b的函数:
function multiply(a,b)
if b = 0 then return 0
else if b is even then
t := multiply(a, b/2);
return t+t;
else if b is odd then
t := multiply(a, b-1);
return a+t;
这是一个将两个整数相乘的函数。我对如何处理递归关系的if else条件感到困惑。我以为答案是T(n)= T(n / 2)+ T(n-1)。正确吗?
答案 0 :(得分:2)
function multiply(a,b)
if b = 0 then return 0
else if b is even then
t := multiply(a, b/2);
return t+t;
else if b is odd then
t := multiply(a, b-1);
return a+t;
因此:
F(0) = 0
If Even: F(N) = F(N/2) + 1
If Odd-Even: F(N) = F(N-1) + 1 = F((N-1)/2) + 2 <-next number is definitely even
解决奇偶双数情况(最坏的情况):
F(N) = F((N-1)/2) + 2 = O(LogN)
思考问题的另一种方式是,我们知道奇偶奇数情况的深度最多是偶偶偶数情况的两倍。偶数情况的深度为LogN
,因此奇偶数情况的深度为2*LogN
。
答案 1 :(得分:0)
赞赏以下两点:
multiply
会触发对相同输入减一个(偶数)的调用。这将需要再打一个电话才能达到偶数。multiply
将触发另一次输入减半的呼叫。结果数将是q.v的偶数或奇数。以上几点。在最坏的情况下,从偶数输入开始,将需要两次 调用,以将传递给multiply
的输入减半。此行为与2*O(lgN)
的运行时间(其中lg
是基于日志的2)一致。这和O(lgN)
一样。