2016-08-16 6 views
1

Javascript再帰では少し奇妙な動作が発生します。私のコードIFとWHILEを使用したJavaScriptの再帰

var temp1 = function(maxLength,accNumber) { 

    if(accNumber.length < maxLength) 
    { 
     accNumber = '0'+accNumber; 
     temp1(maxLength,accNumber); 
    } 
    return accNumber; 
}; 
console.log(temp1(5,"23")); 

だから、ここで私が期待されていない「00023」が、そのは「023」を与えるような出力を期待しています。

whileループと同じコードが期待された出力を得ています。なぜ私は理解していない。予想通り、私に出力 "00023" を与える

var temp1 = function(maxLength,accNumber) { 

    while(accNumber.length < maxLength) 
    { 
     accNumber = '0'+accNumber; 
     temp1(maxLength,accNumber); 
    } 
    return accNumber; 
}; 
console.log(temp1(5,"23")); 

答えて

2

あなたifブロック内returnの文が欠落しています:

var temp1 = function(maxLength,accNumber) { 
 

 
    if(accNumber.length < maxLength) 
 
    { 
 
     accNumber = '0'+accNumber; 
 
     return temp1(maxLength,accNumber); 
 
    } 
 
    return accNumber; 
 
}; 
 
console.log(temp1(5,"23"));

ので、コードのようになるはずです場合と

あなたの機能ifの条件が満たされていれば何も返さなかったなぜが00023の代わりに得られたのかを説明します。

1
あなたのコードが accNumber.length未満 maxLengthであることを検出し、正しく '0'にを追加して、上記の新しい returnなし

return temp1(maxLength,accNumber);

temp1(maxLength,accNumber);

からあなたの再帰呼び出しを変更

正面。しかし、あなたの再帰呼び出しはローカル変数accNumberを変更していないので、戻ってこないので、基本的に何もしません。再帰呼び出しの後、プログラムはifブロックを終了し、元のaccNumber023)を返します。

+0

@AgataBは、あなたがそれを試してみましたか? –

+0

はい、あなたの編集の前に。 – AgataB

+0

@AgataB私の編集は私の答えの論理とは関係がなく、私の答えがなぜ機能するのかの説明が追加されました。 –

1

ifループでは、長さがmaxLengthよりも小さいことが検出されているため、開始時に0が追加され、ループが終了します。長さがまだ小さければ、もう一度チェックしません。したがって、1つの0を追加した後、ループで完了し、出力を返します。

一方、whileループは各繰り返しの後もチェックを続けます。実際に

function(maxLength,accNumber) { 

    if(accNumber.length < maxLength) 
    { 
     accNumber = '0'+accNumber; 
     return temp1(maxLength,accNumber); 
    } 
     return accNumber; 

}; 
+0

ifステートメントが失敗するまでコードは実行されますが、再帰の最初の反復まで戻ってくる変数の値は失われます(最初の値は返されます)。私の答えを参照してください。 –

1

この質問はStrange result using recursion with while loopと重複しているように見えますが、タイプ強制が関与しているかどうかを確認するためにこれを試したかったのです。

これをここで再作成しました。コンソールログのコメントを外して、詳細を確認してください:this jsfiddle

これはスコープの問題です。新しいスコープを作成するたびに最後に終了すると、最も内側の再帰スコープの値(00023)ではなく、最初の再帰的な値accNumber(023)が返されます。違いは、whileループはスコープを失うことはないということです。

var temp1 = function(maxLength,accNumber) { 

    if(accNumber.length < maxLength) // There is no iteration 
    { 
     accNumber = '0' + accNumber; 
     temp1(maxLength,accNumber); // This creates a new scope 
    } 
    return accNumber; // You're only returning the initial iteration result 
}; 
console.log(temp1(5,"23")); 

しかし、しばらくのバージョンで...

var temp1 = function(maxLength,accNumber) { 

    while(accNumber.length < maxLength) 
    { 
     accNumber = '0'+accNumber; 
     temp1(maxLength,accNumber); // Since it is in a while, scope is maintained 
    } 
    return accNumber; 
}; 
console.log(temp1(5,"23")); 
関連する問題