2012-03-02 7 views
1

私はこの計算がreturn base * power(base, exponent - 1);であることを理解するのに苦労しています。ベースは内部にベースを持っているpower関数で再び乗算されますか?誰かがこのコードで何が起こっているのか理解できますか?

var power = function(base,exponent){ 
     if(exponent === 0){ 
      return 1; 
     } else { 
      return base * power(base, exponent - 1); 
     } 
}; 

power(2,2); 

これは、return base = 2*(2,2-1)を意味しますか?

答えて

3

ベースにもう一度ベースを持つパワー関数が乗算されますか?

はい、絶対に、この再帰的な実装が実際に動作する方法です。

あなたが例えばpower(10, 4)を展開すると、あなたが得る:

power(10, 4) 
= 10 * power(10, 3) 
= 10 * 10 * power(10, 2) 
= 10 * 10 * 10 * power(10, 1) 
= 10 * 10 * 10 * 10 * power(10, 0) 
= 10 * 10 * 10 * 10 * 1 

それがうまくいけば、この展開から明確にする必要があり、正確なぜこれは、指数を計算するための有効な(とはいえ遅い)方法です。

+0

これは完全な答えです。しかし、ちょうどFYI、これははるかに遅いですが、関数呼び出しはパフォーマンスが必要なときには本当に高価です。そして、これは指数として正の整数に対してのみ機能します。 –

2

それが指数を計算する再帰的な方法だ常に1

で0パワーまたは2 に上げ2です。 Math.powがうまく機能します。

したがって、指数がゼロの場合、再帰はif (exponent === 0) return 1で終了します。指数がゼロでない場合次に、このメソッドは指数変数を減分することを呼び出します。

マジックはreturn base * power(base, exponent - 1);というメソッドが一度発生するとreturn 1;の値がスタックから引き出され、互いに乗算されます。

これはこれを行う最善の方法ではありません。

+0

返事ありがとう、すみません、私はちょうどその値が実際にここで返されるのを理解しようとしています。 – styler

1

これは、組み込みの方法Math.powカスタム実装です。したがって、これらのステートメントは同じ結果を出力します。

console.log(power(2,8)); // 256 
console.log(Math.pow(2, 8)); // 256 

場合によってはMath.powを使用してください。

関連する問題