2012-07-24 16 views
6

Mi piacerebbe sapere perché sto ottenendo un loop infinito qui. Semplicemente non voglio passare questo valore iniziale, quindi se sono undefined vengono calcolati automaticamente. È solo per pulire la mia chiamata di funzione per utilizzare solo un singolo parametro. Se li passo tutto va bene e il processo finisce. Qualcuno può aiutare? GraziePerché sto ottenendo un ciclo infinito quando non definisco i parametri?

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); 
+1

Grazie per aver corretto i nomi delle variabili. :) Vuoi 'if (inferiore == undefined && upper == undefined)' invece di 'if (! Lower &&! Upper)'. –

+0

@ElliotBonneville dare un'occhiata a come ora la mia funzione Unisci è simile; https://gist.github.com/3165423 - puoi lasciare commenti nella pagina di Gist per miglioramenti !!! Grazie per le critiche positive! =) – renatoargh

risposta

7

Il tuo primissimo chiamata ricorsiva a mergeSort passò 0 come primo argomento, perché si imposta così.

dal !0 evalutes anche false, qui si va ..

migliore controllo contro undefined utilizzando l'operatore di typeof

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

o, meglio ancora, controllare il arguments.length, come

if(arguments.length === 1) { 
    var lower = 0, 
     upper = array.length -1 ; 
} 
+0

Grazie @jAndy, il tipo di rotazione che l'operatore == /! = Esegue mi ha appena catturato questa volta ... Cosa ne pensi di 'if (lower == undefined && upper == undefined)' e/o 'if (inferiore === undefined && upper === undefined)'? – renatoargh

+0

@ RenatoGama: questo va bene anche se i tuoi argomenti sono sempre dichiarati. Controllando 'arguments.length' non hai nemmeno bisogno di avere quel requisito. Ma questa è totalmente una questione di gusti :-) – jAndy

Problemi correlati