2013-10-15 63 views
0

我想这个问题,说我有一个幂函数的递归版本:如何将此递归转换为循环?

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循环?

编辑:我知道这可以通过明确维护堆栈来完成,但在这种特殊情况下有没有这样做的机会?

+0

好像功课。 – devnull

+0

@devnull我是一位助教,被问到这个问题,但不知道如何回答 – dorafmon

+0

这也不是真正的尾递归,因为尾递归授予的优化不适用于这种情况。编辑它肯定不是尾递归。 – Dan

回答

5

看起来像是通过平方算法得到的指数。

这里是你会怎么做迭代:

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

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

     power /= 2;  
     base *= base; 
    } 

    return result; 
} 
+0

您不能修改函数参数可以吗?这不适用于负功率哟 –

+0

@nevercode我没有看到任何关于修改参数的限制 –

+0

@nevercode是的你可以,除非你声明它们是const# – Kevin

0
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; 
} 
+1

这是不相同的算法,它不优化'功率(2,4)'到'功率(功率(2,2),2)' – wimh

+0

你是对的。没有注意到我必须使用相同的算法。 –