再帰とスタックの仕組みについて学習しています。私はこの関数のスタックトレースを理解するのに困っています。なぜ私のconsole.logステートメントが何をしているのか、再帰関数のスタックトレースの理解
function expoRecursion(base, exp) {
debugger;
if(exp == 1) {
console.log('the exp value is ' + exp + ' , base is returned');
return base;
} else {
console.log('line 278 the function evaluates ' + expoRecursion(base, exp -1));
return base * expoRecursion(base, exp-1);
}
}
expoRecursion(2,3);
私はクロームのdevのツールでこれを実行し、それを通じて段階が、基本ケースの後expが1であるときに返される理由の性質を得るように見えることはできませんが、我々は(2、2 expoRecursionをポップ-1)、expoRecursion(2、3-1)に移動し、それがすでに評価されている場合は、スタックexpoRecursion(2、2-1)に再度追加しますか?その後の混乱は、彼らが読んで私のログステートメントから来ているようだ:
the exp value is 1 , base is returned
line 278 the function evaluates 2
the exp value is 1 , base is returned
line 278 the function evaluates 4
the exp value is 1 , base is returned
line 278 the function evaluates 2
the exp value is 1 , base is returned
は、なぜ最後の文2で、その後、最終的な戻り値は、8として戻ってきますか?
結果を記録するために 'expoRecursion'関数を呼び出して新しい再帰を作成しています。' console.log(..... expoRecursion(base、exp -1)); ' – Titus
あなたのログステートメントとあなたのreturnステートメントの両方再帰を呼び出します。それはおそらくあなたが望むものではありません。 – pvg
ああ、私はconsole.logステートメントで関数aginを呼び出していたことに気づきませんでした。 –