我遇到过两个相同功能的变体,想知道哪个渐进效率更高。
1。线性
long double power(int base, int pow)
{
if(pow<0)
return -1;
int i;
long double p;
p = 1;
for(i = 1; i<=pow; ++i)
p = p * base;
return p;
}
2。递归
long double power(int base, int pow)
{
if(pow<0)
return -1;
switch(pow)
{
case 0:
return 1;
case 1:
return base;
default:
return base*power(base, pow-1);
}
}
答案 0 :(得分:3)
两种算法的成本随着pow
的增长而增长。不考虑两者都会在pow
增长时很快溢出,它们需要O(pow)时间(因此具有相同的渐近复杂度)。
在这种情况下如果你对性能感兴趣,你应该更喜欢迭代而不是递归。要理解我的主张,请考虑调用函数时会发生什么:1)推送堆栈帧以保存函数参数和局部变量2)执行函数体3)弹出堆栈帧并返回。递归将理想推送pow
堆栈帧,然后在返回时弹出pow
堆栈帧。
我说理想,因为实际上编译器可能优化尾递归(在函数末尾执行递归调用的递归)并将其转换(几乎) 一个循环。由于编译器通常不对已执行的优化提供保证,因此如果您考虑的是性能,则应该更喜欢迭代版本。