2012-07-24 6 views
6

Me gustaría saber por qué estoy obteniendo un ciclo infinito aquí. Simplemente no quiero pasar estos valores iniciales, por lo que si son undefined se calculan automáticamente. Es solo para limpiar mi llamada de función para usar solo un parámetro. Si los paso, todo funciona bien y el proceso termina. ¿Alguien puede ayudar? Gracias¿Por qué estoy obteniendo un ciclo infinito cuando no defino los parámetros?

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

Gracias por arreglar sus nombres de variables. :) Desea 'if (inferior == undefined && upper == undefined)' en lugar de 'if (! Lower &&! Upper)'. –

+0

@ElliotBonneville eche un vistazo a cómo se ve ahora mi función Merge; https://gist.github.com/3165423 - ¡puedes dejar comentarios en la página principal para mejoras! ¡Gracias por la crítica positiva! =) – renatoargh

Respuesta

7

Su primera llamada recursiva a mergeSort pasó 0 como primer argumento, porque lo establece así.

desde !0 dé como también a false, aquí tienes ..

mejor control contra undefined utilizando el operador typeof

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

o, aún mejor, comprobar el arguments.length, como

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

Gracias @jAndy, el tipo de coersion que el operador == /! = Realiza me acaba de atrapar esta vez ... ¿Qué piensas de 'if (lower == undefined && upper == undefined)' y/o 'if (inferior === undefined && upper === undefined)'? – renatoargh

+0

@RenatoGama: eso está bien también si sus argumentos siempre son declarados. Al marcar 'arguments.length', ni siquiera necesita tener ese requisito. Pero eso es totalmente una cuestión de gusto :-) – jAndy

Cuestiones relacionadas