2013-10-15 62 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

你是對的。沒有注意到我必須使用相同的算法。 –