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 ループに変換するにはどうすればよいかということです。

編集:スタックを明示的に維持することでこれを実行できることはわかっていますが、この特別なケースでは、そうしない可能性はありますか?

4

2 に答える 2

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;
}
于 2013-10-15T16:56:54.563 に答える
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;
}
于 2013-10-15T17:00:51.017 に答える