2012-03-07 5 views
1

これは本当に簡単な例ですが、この再帰を理解できません。それがpower(base, exponent - 1);に行くとき、それは何をすべきでしょうか? exponentが0になるまで、電力が引き続き呼び出されると、何が乗算されますか?誰かがこの再帰的なJSコードを説明して指数を計算できますか?

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

JavaはJavaScriptではありません。削除されたJavaタグ。 –

+0

問題を修正して、より小さいインスタンス 'power(base、exponent - 1)'を得て、 'solve '部分' base'で* use *使用します - この例の "* use *"は単なる乗算です。 – miku

+0

@AndrewWhitakerしかし、それは同じ構文のようなものなので、そこからの人々も知っていると思っていました。 – 0x499602D2

答えて

5

最初から始めましょう。

power(base, 0)に電話をかけましょう。 exponentは0なので、関数は1を返します。

今、power(base, 1)に電話をかけましょう。今度はexponentが0ではないので、関数はpower(base, exponent - 1)を呼び出し、baseで乗算します。 (これはここの鍵です...再帰呼び出しの結果を取り、独自のひねりを追加します)。exponent - 1 = 0で、power(base, 0)が1であるため、結果は実質的にbase * 1です。読む:base

今度はpower(base, 2)になります。それはbase * power(base, 1)になります。 power(base, 1)base * power(base, 0)です。最終結果:base * (base * 1)。読む:baseが四角い。

など。

この関数は明白でない場合がありますが、この関数は負でない整数の指数でのみ機能します。 exponentが負の数である場合、または最も小さいビットでさえも整数より大きいまたは小さい場合、関数は「永遠に」実行されます。 (再帰はあなたのスタックのすべてを食べる一度実際には、あなたは以上の可能性が高い、スタックオーバーフローを引き起こします。)

あなたはについては

if (exponent < 0) return 1/power(base, -exponent); 

のようないくつかのコードで負のパワーのための機能を修正することができ非整数...例外を投げる以外の方法はありません。数値を非整数にすることは意味があるので、指数を切り捨てたり、そうしないとふりをしたりしたくない場合は、間違った答えを返すことになります。

power(2, 3); 

コール:2^3の例を使用

5

これはMath.pow()に似ています。引数baseを引数exponentに上げます。

たとえば、2^416であるため、power(2, 4)16を返します。パワー0に上げ、任意の数は、最後の行

return base * power(base, exponent - 1); 

は、その再帰関数です。1.

に等しい - 指数(パワー)がゼロであり、それはある場合1を返すかどうかを確認するにはif()声明をチェックpower()を呼び出しますが、多くの場合、値はexponentです。


私は下から再帰を説明しようとします。おそらく理解しやすいでしょう。

power()の最下位のコールは、引数として21をとり、1を返します。この戻り値は、power()の第2のアップコールで使用されるので、この時間は、渡された引数は、power()への最上位コールが16を返す24を渡されるまで、その上4を出力し、22、ありますさ。

+0

最終結果はどこから来ましたか。私の考えでは、関数は引き続き呼び出され、指数部は0に落ち続けるので関数は1を返すはずです。しかし、私は 'power(2、5);で32がどこから来るのか分かりません。 – 0x499602D2

+0

あなたと一緒にhttp://en.wikipedia.org/wiki/Exponentiation –

0

基地= 10 電力= 3

10 *パワー(10,2)

10 * 10 *パワー(10,1)

10 * 10 * 10

多分正の整数のために大丈夫です...

1

function power(2, 1) { 
    if (1 === 0) { 
     return 1; 
    } else { 
     return 2 * power(2, 0); //called 
    } 
} 
:につながる

function power(2, 2) { 
    if (2 === 0) { 
     return 1; 
    } else { 
     return 2 * power(2, 1); //called 
    } 
} 

:につながる

function power(2, 3) { 
    if (3 === 0) { 
     return 1; 
    } else { 
     return 2 * power(2, 2); //called 
    } 
} 

もたらす

:最終的に8を返し

function power(2, 3) { 
    if (3 === 0) { 
     return 1; 
    } else { 
     return 2 * 4; //returned 
    } 
} 

:につながる

function power(2, 2) { 
    if (2 === 0) { 
     return 1; 
    } else { 
     return 2 * 2; //returned 
    } 
} 

:につながる

function power(2, 1) { 
    if (1 === 0) { 
     return 1; 
    } else { 
     return 2 * 1; //returned 
    } 
} 

:につながる

function power(2, 0) { 
    if (1 === 0) { 
     return 1; //returned 
    } else { 
     return 2 * power(2, -1); 
    } 
} 

、これは2^3。最初の呼び出しと仮定するとpower(10, 3)ある

2

...

v-----first power() call returns base * (result of next power() call) 
     v-----second power() call returns base * (result of next power() call) 
       v-----third power() call returns base * (result of last power() call) 
        v------result of last power() call returns 1 
(10 * (10 * (10 * (1)))) 
        ^-----return 1 
       ^-----return base * 1 (10) 
     ^-----return base * 10 (100) 
    ^-----return base * 100 (1000) 

または左を下に移動し、右に

。各行は

return base * power(base, 2); // return base * 100 (1000) 
return base * power(base, 1); // return base * 10 (100) 
return base * power(base, 0); // return base * 1  (10) 
return 1;      // return 1    (1) 
0

はのは、いくつかの数学でこれを説明してみましょう... power(10, 3)で始まるpower()以降の呼び出しです。

f(x,y) = x^y      # (1) function definition 
     = x * x * x * ... * x  # (2) multiply x with itself y times 
     = x * (x * x * ... * x) # (3) rewrite using parentheses for clarity 
     = x * (x^(y-1))   # (4) replace the second part by (1) notation 
     = x * f(x, y-1)   # (5) replace again by using f(x,y) notation according to (1) 

f(x,0) = 1      # base case: x^0 = 1 

これに続いて、f(x,y) = x * f(x, y-1)が表示されます。 f(x,0) = 1

if (exponent === 0) { 
    return 1; 
} 

は0番目のパワーに何かが常に1に等しい、すなわち、ベースケース、どこから来るか

あなたも見ることができます。

これは、この再帰の導出方法です。

関連する問題