2014-02-21 181 views
1

我正在爲二進制搜索算法編寫我自己的函數,我似乎無法找到邏輯上的差異。當我搜索4時,它不會返回理想的響應。二進制搜索代碼

下面的代碼:

var list = [1,2,3,4,6,7,13,18,19]; 

function binarySearch(list,number) { 
    var newList = list; 
    while (newList.length >= 1) { 
     var halfNum = Math.round(newList.length/2); 
      if (newList[halfNum] === number) { 
      return "Number Found"; 
     } else if (newList[halfNum] < number) { 
      newList = newList.slice(halfNum + 1,newList.length - 1); 
     } else { 
      newList = newList.slice(0,halfNum - 1); 
     } 
    } 
} 


console.log(binarySearch(list,4)); 
+0

作爲一般調試技術,插入'console.log'調用到代碼以顯示計算出的值的關鍵部分。這將顯示出現問題的地方。 – Matt

+0

@Matt 謝謝,我試過了,我找不出錯誤在代碼中的位置。 –

+0

一個好的開始會在* slice *之後看* newList *。 – RobG

回答

2

這裏的問題是,你正在做的範圍是錯誤的。 JavaScript的切片功能,切斷數組區間[開始,結束),和我的意思是,它不包括新的數組中的結束索引

所以你shoudl更改此:

} else if (newList[halfNum] < number) { 
     newList = newList.slice(halfNum + 1,newList.length - 1); 
    } else { 
     newList = newList.slice(0,halfNum - 1); 
    } 

向該:

} else if (newList[halfNum] < number) { 
     newList = newList.slice(halfNum + 1,newList.length); 
    } else { 
     newList = newList.slice(0,halfNum); 
    }