2

私はJavascriptの初心者です。そして、自分で再帰を試みているときに、whileループを使用すると奇妙な結果が得られました。そして、If ステートメントを使用した正しい結果。

コードと結果は次のとおりです。

var test = function f(n){
    while(n > 0){
        document.write(n);
        f(--n);     
    }
};

test(5);

そして結果:

5432112113211211432112113211211

Ifステートメントを使用している間

var test = function f(n){
    if(n > 0){
        document.write(n);
        f(--n);     
    }
};

test(5);

結果は次のとおりです。

54321

この場合、実際にデバッグすることはできませんwhile。正直に言うと、ある時点で混乱します。

4

2 に答える 2

2

5432112113211211432112113211211 パターンを見ることができます:

5432112113211211
 432112113211211

543211211
  3211211
 43211211
  3211211

543211
   211
  3211
   211
 43211
   211
  3211
   211

etc

これらは、通過するすべてのループです。最初に 5 を出力し、次に 4 に分割し、3 に分割します。

于 2012-07-10T23:28:01.437 に答える
1

注意すべき重要なことは、 内でコードを実行するたびに、 という名前の新しい変数fで新しいスコープが作成されるということです。したがって、 を再帰的に呼び出すことで、スコープ チェーンに追加されます。になるまでスコープ チェーンに追加し続けます。false になると、他のバージョンの が存在するスコープ チェーンをたどり始めます。このプロセスは、すべてのスコープのすべての変数が になるまで繰り返されます。nfn > 0falsenn0

以下の数字にスペースを追加すると発生するパターンに注目してください。コードがスコープチェーンを上る必要があるたびに、スペースを追加しました。一連の数字はすべて、スコープ チェーンを下るコードを表します。

54321 1 21 1 321 1 21 1 4321 1 21 1 321 1 21 1

これは役立つはずのjsfiddleです。2 つの数値を出力します。最初の数値は現在のスコープを表し、2 番目の数値はコードで出力していた数値と同じです。最初の数字を見て、スコープごとに新しい数字がどのように作成されるかを理解してください。nプログラムの後半でそのスコープに戻ったときに、 の値がどうあるべきかを考えてみてください。

于 2012-07-10T23:35:42.523 に答える