2016-05-28 14 views
0

問題の再発関係があるJavaScript再帰リターン?

function power(base, exponent) { 
if (exponent == 0) 
return 1; 
else 
return base * power(base, exponent - 1); /* 2*2*2, this returns only base? 
i thought at first it was, 2*(2,3-1) so it would return 2*(2,2)? 
calling itself until reach 0, so why exponent is out?*/ 
} 

console.log(power(2, 3)); 
// → 8 
+0

'2 * 2 * 2 * 1 ' – 4castle

+0

ええ、なぜ:

このYouTubeのビデオはうまく再帰可視化?印刷されない指数が減少するのはなぜですか? –

+0

@GlendonPhilippBaculio:「印刷されていない」とはどういう意味ですか?印刷しているのは結果 '8'だけです。 – Bergi

答えて

2

多くの場合、再帰関数はループとして表現できます。この適応を参照してください。

function power(base, exponent) { 
    var result = 1; 
    for (var i = 0; i < exponent; i++) 
     result *= base; 
    return result; 
} 

あなたが見ることができるように、指数はそれだけで作るループの数を表し、出力が何であるかには全く役割を果たしていません。

再帰の世界では、指数は、関数が返される前に関数自体がまだ呼び出されていない回数を表します。それは実際にやっているComputerphile

+0

私はそれを知っていませんでした。特に関数の中でも特に役に立ちます。 –

+1

@Glendon私は、ループを理解することで再帰を完全に理解できるとは思いません。再帰にスタックが必要です! – rand

+0

@Ivenもちろん、この場合ループは、類推をするためによく知られた概念を使用するため、優れた教授援助です。その類推はもちろん完璧ではない。そうでなければ再帰は存在しないだろう。 – 4castle

0

..私はそれが簡単に何が起こっているかを知るために、雄弁JavaScriptで再帰を理解することに苦労していますが、私は理由を理解することはできません。

p(n) = base * p(n-1) 
Expanding, p(n-1) = base * p(n-2) 
Expanding, p(n-2) = base * p(n-3) 
And so on.. till 
p(1) = base * p(0) 
Effectively, it becomes, 
p(n) = base * base ..........n times * 1 
1

まず、再帰関数呼び出しがスタックを構築します。各再帰呼び出しは、ベースケースに達するまで指数を1つ減らします。ベースケースはゼロになるように指数を必要とし、いずれかを返す:最大再帰の深さに達したとき

power(2,3) 
2 * power(2,2) 
    … 2 * power(2,1) 
     … 2 * power(2,0) 
      … 1 // base case is reached 

は次に、スタックが巻き戻されます。この時点で、実際の計算が行われます。

2 * power(2,0) becomes 2 * 1 = 2 is returned 
2 * power(2,1) becomes 2 * 2 = 4 is returned 
2 * power(2,2) becomes 2 * 4 = 8 is returned 

完了したスタックフレームはありません。 8が最終結果です!

+0

私はそれを得ます、なぜスタックは巻き戻されていますか?それは私にはっきりしていない、そしてコメントからそれは内部のカウンターですか? –

+0

'exponent'が' 0'のとき、(exponent == 0)が1を返すと、ベースケースに到達します。もう一度 'power'を呼び出すのではなく、' 1'を返します。 – rand

+0

@Bergi:ありがとう、はるかに明確です! – rand