【问题标题】:How to convert this recursion into a loop? [closed]如何将此递归转换为循环? [关闭]
【发布时间】:2013-10-23 13:44:09
【问题描述】:

我正在考虑这个问题,假设我有一个幂函数的递归版本:

double pow(double base, int power){
    if(power == 1 || power == 0){
        return base;
    }
    else if(power % 2 == 0){ 
        double result = pow(base,power/2);
        return result * result;
    }
    else{
        double result = pow(base,(power-1)/2);
        return result * result * base;
    }

}

我的问题是如何将这个转换为 while 循环?

编辑:我知道这可以通过显式维护堆栈来完成,但在这种特殊情况下,是否有机会不这样做?

【问题讨论】:

  • @devnull 我是一名助教,被问到这个问题,但不知道如何回答
  • 这也不是真正的尾递归,因为尾递归授予的优化在这种情况下不适用。通过编辑,它肯定不是尾递归。
  • @Dan 编辑并移出尾递归位
  • 纠正你的代码:如果power==0那么你的函数应该返回1而不是base
  • @dorafmon I am a TA and got asked the question, but do not know how to answer -- 我非常同情你们的学生。

标签: c algorithm loops recursion


【解决方案1】:

看起来是平方算法的幂运算。

以下是迭代的方法:

double pow(double base, int power)
{
    double result = 1;

    while (power != 0)
    {
        if (power % 2 == 1)
            result *= base;

        power /= 2;    
        base *= base;
    }

    return result;
}

【讨论】:

  • 不能修改函数参数可以吗?这不适用于负能量哟。
  • @nevercode 我没有看到关于修改参数的任何限制。
  • @nevercode 是的,你可以,除非你声明它们const
  • 我的错,我以为你不能。
  • @nevercode 有人认为重新分配参数是不好的形式;我认为需要使用一些判断力,但在某些情况下这很好。在这里,由于我们正在模仿递归,我认为更改参数比使用第二组变量更有意义。
【解决方案2】:
double power(double base, int power){
    if(power == 1){
        return base;
    }

    if (power == 0)
    {
        return 1;
    }     
    int absolutePower = abs(power);
    double result = 1;  
    for (int i = 0; i < absolutePower; i++)
    {
        result = result * base;
    }      
    if (power < 0)
    {
        result = 1/result;
    }
    return result;
}

【讨论】:

  • 这不是同一个算法,它不会将power(2,4)优化成power(power(2,2),2)
  • 你是对的。没有注意到我必须使用相同的算法。
猜你喜欢
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
相关资源
最近更新 更多