2017-04-06 14 views
-2

再帰とスタックの仕組みについて学習しています。私はこの関数のスタックトレースを理解するのに困っています。なぜ私の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として戻ってきますか?

+1

結果を記録するために 'expoRecursion'関数を呼び出して新しい再帰を作成しています。' console.log(..... expoRecursion(base、exp -1)); ' – Titus

+1

あなたのログステートメントとあなたのreturnステートメントの両方再帰を呼び出します。それはおそらくあなたが望むものではありません。 – pvg

+0

ああ、私はconsole.logステートメントで関数aginを呼び出していたことに気づきませんでした。 –

答えて

1

他の人がすでに混乱の基礎を指摘している:あなたは他の句で二回を再発しました。私は、これはあなたのためにそれをクリーンアップすると思います:、一度だけ再発し、結果を保存し、両方の場所でことを使用します。

} else { 
    recur_result = expoRecursion(base, exp -1); 
    console.log('line 278 the function evaluates ' + recur_result); 
    return base * recur_result; 
} 

は、それはあなたの期待と一致するかどうかを参照してください。

+0

わかりました、私は私のエラーを見て、私の混乱に何を加えましたか。 –