6

ここで無限ループが発生する理由を知りたいです。この初期値を渡したくないので、そうであればundefined自動的に計算されます。単一のパラメーターのみを使用するように関数呼び出しをクリーンアップするだけです。それらを渡すと、すべてが正常に実行され、プロセスが終了します。誰でも助けることができますか?ありがとう

function merge(array, lower, half, upper){
    //Suppressed for the sake of brevity
}

function mergeSort(array, lower, upper){
    if(!lower && !upper){ //take a look here
        lower = 0;
        upper = array.length - 1;
    }

    if(lower < upper){
        var half = Math.floor((lower + upper)/2);

        mergeSort(array, lower, half);
        mergeSort(array, half + 1, upper);
        merge(array, lower, half, upper);
    }
}

var array = [8, 3, 6, 4, 1, 0, 23, 12, 15, 63];
mergeSort(array); //infinite loop here
console.log(array);
4

1 に答える 1

7

mergeSort最初の引数として渡した最初の再帰呼び出しは0、そのように設定したためです。

!0も に評価されるのでfalse、どうぞ。

演算子undefinedを使用して確認することをお勧めしますtypeof

if(typeof lower === 'undefined' && typeof upper === 'undefined'){ //take a look here
    lower = 0;
    upper = array.length - 1;
}

または、さらに良いことに、のarguments.lengthようにチェックしてください

if( arguments.length === 1 ) {
   var lower = 0,
       upper = array.length -1 ;
}
于 2012-07-24T15:49:55.047 に答える