0
 {
System.out.println (base + " to the " + i + " power =  " + 
                          power(base, i));   
}

    public static double power(double baseNum, int exp) 
    {
        if (exp == 0)
            return 1;
        else
            return baseNum * power(baseNum, --exp); 
    }  

簡単な質問ですが、上記の「power」というメソッドは、「1」を返すと、どういうわけか解を答えに戻します。したがって、2 ^ 5 を計算するパラメーターを渡すと、RETURN 1 はどういうわけか 32.0 になります。ここで何が起こっているのですか?「1」はどのようにして 32.0 になるのですか?

4

7 に答える 7

3

再帰

power(2, 5)
= 2 * power(2, 4)
== 2 * 2 * power(2, 3)
=== 2 * 2 * 2 * power(2, 2)
==== 2 * 2 * 2 * 2 * power(2, 1)
===== 2 * 2 * 2 * 2 * 2 * power(2, 0)
====== 2 * 2 * 2 * 2 * 2 * 1 (exp == 0)
===== 2 * 2 * 2 * 2 * 2
==== 2 * 2 * 2 * 4
=== 2 * 2 * 8
== 2 * 16
= 32
于 2012-11-08T02:44:03.280 に答える
1
else
    return baseNum * power(baseNum, --exp);

そのコードはすぐそこにあります。関数の1つが1をpower返す場合、実際にはこれによって呼び出されました。したがって、次のようになります。

return baseNum * power(baseNum, --exp);

そしてpower返された1、つまり:

return baseNum * 1;

その場合、baseNumは32.0になります。

再帰。

より良い説明: http://pastebin.com/raw.php? i = dHTnSPuY(私のコメントは@記号で始まります)

于 2012-11-08T02:41:30.900 に答える
1

power(2、5)-> 2 * power(2,4)-> 2 * 2 * power(2,3)-> 2 * 2 * 2 * power(2,2)-> 2 * 2 * 2 * 2 * power(2,1)-> 2 * 2 * 2 * 2 * 2 * power(2,0)->32。

于 2012-11-08T02:43:12.863 に答える
1

これは、しゃれを許すなら、再帰の力です。それはこのように動作します:

power(2, 5) = 2 * power(2, 4)
            = 2 * 2 * power(2, 3)
            . . .
            = 2 * 2 * 2 * 2 * 2 * power(2, 0)
            = 2 * 2 * 2 * 2 * 2 * 1
            = 32
于 2012-11-08T02:45:08.400 に答える
1

あなたはすでに答えを持っているので。再帰位置の詳細については、これを参照してください。01:47

于 2012-11-08T02:49:58.777 に答える
0

再帰では、覚えておくべき重要なことが 1 つあります。それは基本ケースです。すべての再帰は、ある時点で停止する必要があります。それは永遠に続くことはできません。

したがって、累乗関数では、これが基本ケースです。

if (exp == 0)
    return 1;

exp が 0 の場合は停止します。それがないと、stackoverflow が発生します。

于 2012-11-08T02:54:43.827 に答える
0

関数の出力を指定する方法を検討してくださいpower(base, exp)

basebには、以下を指定します。

power(b, 0) = b^0 = 1
power(b, 1) = b^1 = b
power(b, 2) = b^2 = b * b
power(b, 3) = b^3 = b * b * b
...
power(b, n) = b^n = b * b * ... * b  (n times)

指数を 1 ずつ増やすたびに、結果を で乗算しbて新しい結果を取得することに注意してください。一般に、次の 2 つのルールを使用してシーケンス全体を生成できます。

  1. b^0 = 1すべてのためにb
  2. b^n = b^(n-1) * bすべての正の整数n

これら 2 つのルールは、指定した関数定義に直接変換されます。

public static double power(double baseNum, int exp) 
{
    if (exp == 0)  /* when the exponent is zero, the result is always 1. */
        return 1;
    else           /* otherwise, the power is equal to b^(n-1) * b. */
        return baseNum * power(baseNum, --exp); 
}

正の整数指数で開始する場合、指数がゼロになるまで、ルール 2 を使用して小さい方の指数に基づいて結果を計算します。

最後に、いくつかのメモ。

  1. このelse節では、プリインクリメントを使用するよりも単純に減算を示す方が明確です。つまり、次の使用を検討してください。

    return baseNum * power(baseNum, exp - 1); /* exp - 1 instead of --exp */
    
  2. 関数に負の値が渡された場合exp、再帰的に何度も自分自身を呼び出してメモリを使い果たした後にクラッシュする可能性があります。

  3. 関数で負のインデックスを考慮したい場合は、指数がゼロに向かって移動するように再帰ルールを逆にすることを除いて、再帰呼び出しを使用できます。

    public static double power(double base, int exp)
    {
        if (exp == 0)
            return 1;
        else if (exp < 0)
            return power(base, exp + 1) / base;
        else
            return power(base, exp - 1) * base;
    }
    
于 2012-11-08T03:15:15.570 に答える