関数の出力を指定する方法を検討してください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 つのルールを使用してシーケンス全体を生成できます。
b^0 = 1
すべてのためにb
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 を使用して小さい方の指数に基づいて結果を計算します。
最後に、いくつかのメモ。
このelse
節では、プリインクリメントを使用するよりも単純に減算を示す方が明確です。つまり、次の使用を検討してください。
return baseNum * power(baseNum, exp - 1); /* exp - 1 instead of --exp */
関数に負の値が渡された場合exp
、再帰的に何度も自分自身を呼び出してメモリを使い果たした後にクラッシュする可能性があります。
関数で負のインデックスを考慮したい場合は、指数がゼロに向かって移動するように再帰ルールを逆にすることを除いて、再帰呼び出しを使用できます。
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;
}