2017-04-14 20 views
0

次のコードスニペットがエラーにつながる理由を理解できません。何か案は?JavaScript再帰、配列逆順

最大コールスタックのサイズは、ポストインクリメント及びポストデクリメントを使用しているためです

function reverseArrayInPlace(array, low, high) { 
 
    if (low == undefined) { 
 
    low = 0; 
 
    } 
 
    if (high == undefined) { 
 
    high = array.length - 1; 
 
    } 
 

 
    if (low >= high) { 
 
    return; 
 
    } 
 

 
    var temp = array[low]; 
 
    array[low] = array[high]; 
 
    array[high] = temp; 
 

 
    return reverseArrayInPlace(array, low++, high--); 
 
} 
 

 
var arrayValue = [1, 2, 3, 4, 5]; 
 
reverseArrayInPlace(arrayValue); 
 
console.log(arrayValue);

+1

。あなたはいつもJSエンジンが最終的にブロックする再帰的なケースに陥ります。そうしなければ、永遠に続くからです。アルゴリズムをデバッグするのに役立つかもしれません。 – joews

+0

はい、真実で、ベースケースはヒットしません。なぜ、正確には、各呼び出しでローがインクリメントされ、ハイがデクリメントされ、最終的には低> =高の条件が真であることを指し示す必要があります。 – fg78nc

+0

デバッガはこのような問題を追跡します。または、少なくともいくつかの 'console.log'呼び出しを入れて、渡されている値を追跡してください。 –

答えて

7

を超えました。変数をインクリメント/デクリメントしますが、古い値を返します。したがって、再帰で古い値を渡しています。その結果、再帰呼び出しは元の呼び出しと同じになり、無限に再帰します。

プリインクリメント/デクリメント - ++low--high - は正しく動作します。しかし、変数を一度も更新する必要はありません。通常の加減算をするだけです。

再帰呼び出しを行うときに、return reverseArrayInPlace()を使用しても意味がありません。これは、ベースケースが何も返さないためです。ちょうどreturnステートメントにそれを入れないで再帰的な呼び出しを行います。

function reverseArrayInPlace(array, low, high) { 
 
    if (low == undefined) { 
 
    low = 0; 
 
    } 
 
    if (high == undefined) { 
 
    high = array.length - 1; 
 
    } 
 

 
    if (low >= high) { 
 
    return; 
 
    } 
 

 
    var temp = array[low]; 
 
    array[low] = array[high]; 
 
    array[high] = temp; 
 

 
    reverseArrayInPlace(array, low + 1, high - 1); 
 
} 
 

 
var arrayValue = [1, 2, 3, 4, 5]; 
 
reverseArrayInPlace(arrayValue); 
 
console.log(arrayValue);

+2

OPはまた、再帰呼び出しで 'return'を必要としません。 –

+0

ありがとう、それを得た、ケースを逃した。 – fg78nc

+0

再帰呼び出しを行うときにリターンを使うことには意味がありません。ベースケースは何も返さないからです。 あなたは明確にしてください - 私は関数を終了するだけでベースケースでリターンを使用しています。 – fg78nc

0

あなたは、再帰呼び出しで++低いと--highを使用する必要があるため。あなたのバージョンの は、値が最初に渡されて変更されます。 (低> =高)は `ヒットされていない場合は、あなたの基本ケースを、`意味

function reverseArrayInPlace(array, low, high) { 
 
    if (low == undefined) { 
 
    low = 0; 
 
    } 
 
    if (high == undefined) { 
 
    high = array.length - 1; 
 
    } 
 

 
    if (low >= high) { 
 
    return; 
 
    } 
 

 
    var temp = array[low]; 
 
    array[low] = array[high]; 
 
    array[high] = temp; 
 

 
    return reverseArrayInPlace(array, ++low, --high); 
 
} 
 

 
var arrayValue = [1, 2, 3, 4, 5]; 
 
reverseArrayInPlace(arrayValue); 
 
console.log(arrayValue);

+0

プリインクリメントとプリデクリメントの使用は無駄です。これらの変数は再帰呼び出し後には無効です。ちょうど 'low + 1'と' high-1'で再帰します。 –

関連する問題