2016-05-01 167 views
-2

我創建了函數getIndex獲取索引,我從數組中搜索索引。JavaScript while while循環不起作用

當我改變了while (1),而不是while (max < min)這個循環是否正常工作,但條件(while (max < min))它的返回-1。但我需要條件檢查,如果我的搜索不存在於data陣列中。爲什麼它返回-1的條件?

// assume my array looks-like this. 
var data = [1, 2, 3, 4, 5, 7, 8, 9, 10]; 

function getIndex(search, arr) { 
    var min, max, guess, count; 
    min = 0; 
    max = arr.length - 1; 
    count = 0; 

    // If my search is not present in array. Return -1. 
    while (max < min) { 
     count++; 
     guess = Math.floor((min + max)/2); 
     if (arr[guess] === search) { 
      return guess; 
     } else if (arr[guess] < search) { 
      min = guess + 1; 
     } else { 
      max = guess - 1; 
     } 
    } 
    return -1; 
} 

getIndex(8, data); // return -1 
+1

爲什麼不你只需要使用'data.indexOf(search)'? –

+1

爲什麼你使用一種特殊和最糟糕的方式(在時間複雜度方面)來搜索數組? –

回答

1

更改,而條件while(max>min)

1

你在這裏做錯誤.You're檢查max小於min或不和,而循環你最小值設置爲0,最大值以上陣列的長度。那麼Max如何可以小於min?這是正確的,因爲條件是錯誤的,不要進入循環。你需要「最小值小於最大值」或「最大值大於最小值」(都用於同樣的目的),條件是它可以正常工作。

1

變化最大和最小的,而狀態之間的操作

// assume my array looks-like this. 
var data = [1, 2, 3, 4, 5, 7, 8, 9, 10]; 
debugger; 
function getIndex(search, arr) { 
    var min, max, guess, count; 
    min = 0; 
    max = arr.length - 1; 
    count = 0; 

    // If my search is not present in array. Return -1. 
    while (max > min) { 
     count++; 
     guess = Math.floor((min + max)/2); 
     if (arr[guess] === search) { 
      return guess; 
     } else if (arr[guess] < search) { 
      min = guess + 1; 
     } else { 
      max = guess - 1; 
     } 
    } 
    return -1; 
} 

getIndex(8, data); // return -1 
0

可以使用for循環,更容易理解

// assume my array looks-like this. 
 
var data = [1, 2, 3, 4, 5, 7, 8, 9, 10]; 
 

 
function getIndex(search, arr) { 
 
    var guess = -1; 
 
    // If my search is not present in array. Return -1. 
 
\t 
 
\t for(var i=0;i<arr.length;i++){ 
 
\t \t if(arr[i]===search)guess = i; 
 
\t } 
 
\t return guess; 
 
} 
 

 
console.log(getIndex(8, data)); // return -1