渐近高效的两者

时间:2015-07-03 16:32:38

标签: c algorithm recursion

我遇到过两个相同功能的变体,想知道哪个渐进效率更高。

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);
    }
}

1 个答案:

答案 0 :(得分:3)

两种算法的成本随着pow的增长而增长。不考虑两者都会在pow增长时很快溢出,它们需要O(pow)时间(因此具有相同的渐近复杂度)。

在这种情况下如果你对性能感兴趣,你应该更喜欢迭代而不是递归。要理解我的主张,请考虑调用函数时会发生什么:1)推送堆栈帧以保存函数参数和局部变量2)执行函数体3)弹出堆栈帧并返回。递归将理想推送pow堆栈帧,然后在返回时弹出pow堆栈帧。

我说理想,因为实际上编译器可能优化尾递归(在函数末尾执行递归调用的递归)并将其转换(几乎) 一个循环。由于编译器通常不对已执行的优化提供保证,因此如果您考虑的是性能,则应该更喜欢迭代版本。