2014-03-04 1 views
0

에서 나는 반복적으로 특정 값을 검색하려고 간단한 배열 [3,7,9]을 가지고있다. 검색 할 값이 존재하지 않으면 배열에 추가되고, 그렇지 않으면 배열에 추가됩니다. 스위치 케이스 구조를 사용하고 있지만 심각한 문제에 직면하고 있습니다.다시 조건

사전 검색 값 2. 모든 함수의 복귀까지 미세하다. 어떤 이유로 코드가 다시 돌아 가기 위해 점프합니다. "case a :"에서 line - itemFound를 'undefined'로 설정합니다. 왜이 점프가 일어날까요?

검색하고 값 5는 휴식을 뒤로 점프; "case b :"에서 다시 itemFound는 "undefined"값을 얻습니다.

는 다른 값으로 더 점프있다.

나는 코드가 조건에서 하나의 전용 스위치의 경우 종료 할 것으로 예상합니까. 어떤 이유 코드에 대한

myArr = [3, 7, 9]; 

window.onload = init; 

function init() { 

    searchItem(myArr, 2); 
    searchItem(myArr, 5); 
    searchItem(myArr, 8); 
    searchItem(myArr, 10); 
    searchItem(myArr, 7); 

    var arrLength = myArr.length; 
    for (var i = 0; i < arrLength; i++) { 
     console.log('index ' + i + ' ' + myArr[i]); 
     // alert(myArr); 
    } 
} 

function searchItem(array, itemToSearch) { 
    var itemFound; 
    var itemArray = array.slice(0); 
    var arrLen = itemArray.length; 
    var midPointIndex = Math.round(itemArray.length/2) - 1; 
    var midPointVal = itemArray[midPointIndex]; 

    switch (true) { 

     //case a: 
     case midPointVal < itemToSearch: 
      if (arrLen > 1) { 
       itemArray.splice(0, midPointIndex + 1); 
       searchItem(itemArray, itemToSearch); 
      } else { 
       itemFound = false; 
      } 
      break; 

     //case b: 
     case midPointVal > itemToSearch: 
      if (arrLen > 1) { 
       itemArray.splice(midPointIndex, arrLen - midPointIndex); 
       searchItem(itemArray, itemToSearch); 
      } else { 
       itemFound = false; 
      } 
      break; 

     //case c: 
     case midPointVal === itemToSearch: 
      itemFound = true; 
      break; 
    } 

    if (itemFound === false) { 
     myArr.push(itemToSearch); 
     myArr.sort(); 
     //arraySort(myArr); 
    } 


    console.log('Value ' + itemToSearch + ' found' + ': ' + itemFound); 

    return itemFound; 
} 
+0

@Andy : 분명히 그는 배열이 정렬 될 것으로 기대합니다. – Bergi

답변

0

휴식 다시 점프; "case a :"에서 line - itemFound를 'undefined'로 설정합니다. 왜이 점프가 일어날까요?

return은 호출 스택에서 한 레벨 뒤로 건너 뜁니다. 함수 내에서 점프가 발생하지는 않지만 재귀 호출에서 호출 된 곳으로 점프합니다. itemFound은 아직 정의되지 않았습니다.

나는 반복적으로 특정 값을 검색하려고합니다. 검색 할 값이 존재하지 않으면 배열에 추가되고, 그렇지 않으면 배열에 추가됩니다.

myArr.push(itemToSearch); 완전히 다른 배열에 항목을 추가 않습니다 - 다행히 하나는 처음에 통과 않았다,하지만 여전히 나쁜 습관이다. 대신, 당신이 방금 itemArray의 예상 위치에 추가했다면 훨씬 더 효율적입니다. - 어떤 위치에 삽입해야하는지 이미 알고 있기 때문에, 이후에 .sort() 할 필요가 없습니다.

그러나 재귀 구현에서는 배열을 복사 (슬라이스) 및 수정 (스플 라이스)하므로 단순히 현재 배열에 추가 할 수 없습니다. 대신 어레이를 그대로두고 검색 할 두 변수/매개 변수 leftIndexrightIndex을 사용하십시오.