2012-07-24 12 views
6

Chciałbym wiedzieć, dlaczego dostaję tutaj nieskończoną pętlę. Po prostu nie chcę przekazywać tych początkowych wartości, więc jeśli są one undefined, zostaną automatycznie obliczone. Ma tylko oczyścić wywołanie funkcji, aby użyć tylko jednego parametru. Jeśli je przepuszczę, wszystko działa poprawnie i proces się kończy. Czy ktoś może pomóc? DziękiDlaczego otrzymuję nieskończoną pętlę, gdy nie definiuję parametrów?

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

Dziękujemy za naprawienie nazw zmiennych. :) Chcesz 'if (lower == undefined && upper == undefined)' zamiast 'if (! Lower &&! Upper)'. –

+0

@ ElliotBonneville przyjrzyj się, jak wygląda teraz moja funkcja Merge; https://gist.github.com/3165423 - możesz dodawać komentarze na stronie głównej w celu ulepszenia !!! Dzięki za pozytywną krytykę! =) – renatoargh

Odpowiedz

7

Twój pierwszy rekurencyjne wywołanie mergeSort przekazał go 0 jako pierwszy argument, bo to tak ustawione.

od !0 evalutes także false, tutaj idziesz ..

Lepiej sprawdzić przed undefined za pomocą operatora typeof

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

lub, jeszcze lepiej, sprawdź arguments.length, jak

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

Dzięki @jAndy, ten typ mocy, który operator == /! = Wykonuje właśnie mnie złapał tym razem ... Co sądzisz o 'if (lower == undefined && upper == undefined)' i/lub 'if (lower === undefined && upper === undefined)'? – renatoargh

+0

@RenatoGama: To dobrze, jeśli twoje argumenty są zawsze zadeklarowane. Sprawdzając 'arguments.length' nie musisz nawet mieć tego wymogu. Ale to jest całkowicie kwestia gustu :-) – jAndy

Powiązane problemy