【发布时间】:2011-02-01 02:32:26
【问题描述】:
我正在尝试计算递归算法的时间复杂度,我想我已经差不多了。这是我一直在看的伪代码:
long pow( long x, int n ) {
if (n == 0)
return 1;
if (n == 1)
return x;
if(isEven(n))
return pow(x, n / 2 ) * pow(x, n / 2);
else
return x * pow(x * x, n / 2);
}
isEven 仅确定传递给它的整数是否为偶数,就本示例而言,它以恒定时间运行。
因此,如果 n = 0 或 n = 1,则它运行它具有恒定时间运行,如下所示: f(n) = C0。 但是,当 n > 1 时,它应该像这样运行: 当 n 为偶数时 f(n)= f(n-1) + f(n-1) + C1,当 n 为奇数时 f(n)= f(n-1) + 1,对吗?还是应该是:f(n)= f(n/2) + f(n/2) + C1,当 n 为偶数时,f(n)= f(n/2) + 1,当 n 为奇数时?
我查看了很多示例。 Here 是我觉得很有帮助的一个。我的问题源于当 n 是偶数时有两个递归调用。我不完全确定在这里做什么。如果有人能指出我正确的方向,我将不胜感激。
【问题讨论】:
-
请允许我欢迎您来到 StackOverflow,并提醒我们通常在这里做的三件事:1) 当您获得帮助时,请尝试在您的专业领域中回答问题 2)
Read the FAQs3)当你看到好的问答时,投票给他们using the gray triangles,因为系统的可信度是基于用户通过分享他们的知识而获得的声誉。还记得接受更好地解决您的问题的答案,如果有的话,by pressing the checkmark sign -
这个新手问题问得很好。
-
您是否有意使用相同的参数对
pow(x, n / 2)进行两次递归调用?你可以只做long r = pow(x, n / 2); return r * r;,这样不仅效率更高,而且分析更简单。
标签: algorithm big-o time-complexity