0

私は JavaScript を学んでいて、演習の 1 つは累乗関数を書くことでした。ばかげているように聞こえるので、数学も学ぶ必要があります。

$2 * 2 * 2 * 2 = 16$ であるため、$2 ^ 4 = 16$ であることは直感的にわかります。しかし、関数を読んでみると、16 ではなく 12 を返す必要があるようです。

数字を入れると、次のようになります: $$2 * (2 * (4 - 1)) = 12$$

var power = function( base, exponent ) {
  if ( exponent === 0 ) return 1;
  return base * power( base, exponent - 1 );
};
power(2,4);
===> 16

明らかに、私は関数を間違って読んでいるに違いありません。しかし、どのように?

4

4 に答える 4

2

関数は正しく記述されており、再帰が進み、指数が減少するにつれて、関数の結果を分析することから始めることができます。

  1. パラメータ: 2, 4. 結果: 2 * 累乗 (2, 3) = 2 * 8 = 16.
  2. パラメータ: 2, 3. 結果: 2 * 累乗 (2, 2) = 2 * 4 = 8.
  3. パラメータ: 2, 2. 結果: 2 * べき乗 (2, 1) = 2 * 2 = 4.
  4. パラメータ: 2, 1. 結果: 2 * 累乗 (2, 0) = 2 * 1 = 1.
  5. パラメータ: 2、0。結果: 1。

お役に立てば幸いです。

于 2012-05-20T14:47:31.230 に答える
1

これは再帰的に 16 を返します。 $function$ が $f$ で表される場合:

f(2, 4)=2*f(2, 3)=\ドット=2*2*2*2*f(2, 0)=2*2*2*2*1=16

より一般的には、

f(a, b)=a*...*a*1 <- n 回。

于 2012-05-20T14:40:33.317 に答える
0

最後から始めて、関数がどのように動作するかを検討すると役立つ場合があります。

したがって、指数が $0$ に等しい場合、$1$ が返され、これに基数が掛けられ、これらすべてに再び基数が掛けられます。以下同様です。

$$ (((2^0*2)*2)*2)\ldots)*2 $$

于 2012-05-20T14:46:26.747 に答える
0

重要なのは再帰です。

power(2,4)
   = 2 * power(2,3)
   = 2 * (2 * power(2,2))
   = 2 * (2 * (2 * power(2,1)))
   = 2 * (2 * (2 * (2)))
   = 16

powerより小さな指数で自分自身を呼び出し、指数が 1 になるまで自分自身を呼び出します。答えは単なる基数です。

于 2012-05-21T11:28:07.990 に答える