【问题标题】:Javascript Binary Search algorithm unable to find number in the listJavascript二进制搜索算法无法在列表中找到数字
【发布时间】:2020-02-19 20:36:57
【问题描述】:

以下代码似乎无法在列表中找到数字。为什么会这样?

尝试将要搜索的数字设为“9”以及由 1-10 之间的数字组成的数字数组(包括 1-10)。

array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
count = 0;

function binarySearch(array, number) {
    mid = Math.floor(array.length / 2);
    if (number === array[mid]) {
        return count;
    }

    else if (number < array[mid] && array.length > 1) {
        count++;
        arrayFirst = array.splice(0, array[mid]);
        console.log("Tried: ", array[mid])
        console.log(arrayFirst);
        return binarySearch(arrayFirst, number);
    }

    else if (number > array[mid] && array.length > 1) {
        count++;
        arraySecond = array.splice(array[mid], array.length);
        console.log("Tried: ", array[mid])
        console.log(arraySecond);
        return binarySearch(arraySecond, number);
    }

    else {
        return 'number doesnt exist';
    }


}
console.log(binarySearch(array, 4));
代码现在正在努力寻找数字 10 新编辑:

       array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13,14,15,16,17,18,19,20];
    count = 0;
    
    function binarySearch(array, number) {
        mid = Math.floor(array.length/ 2);
        if (number === array[mid]) {
            return count;
        }
    
        else if (number < array[mid] && array.length > 1) {
            count++;
            arrayFirst = array.splice(0, mid);
            console.log("Tried: ", array[mid])
            console.log(arrayFirst);
            return binarySearch(arrayFirst, number);
        }
    
        else if (number > array[mid] && array.length > 1) {
            count++;
            arraySecond = array.splice(array[mid], mid);
            console.log("Tried: ", array[mid])
            console.log(arraySecond);
            return binarySearch(arraySecond, number);
        }
    
        else {
            return 'number doesnt exist';
        }
    
    
    }
    
    console.log(binarySearch(array, 10));

【问题讨论】:

  • 你的条件包含一个未定义的变量arr...它叫做array
  • 是的,我刚才也发现了,谢谢!
  • 查看索引,当你执行“Math.floor(array.length/ 2)”时你得到 10,但 array[10] 它是第 11 个元素

标签: javascript binary-search


【解决方案1】:

这个:

array = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;

不是一个数组,它被解释为一个初始化列表,像这样:

 array = 1, x = 2, y = 3...;

所以你的array 只是1,而不是整个列表。另外请记住,不建议声明没有 var 关键字的变量。它可能会意外覆盖现有的全局变量。您应该根据该变量的使用情况使用varletconst

相反,这应该是您的数组:

array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

【讨论】:

  • 啊哈!愚蠢的错误,谢谢我是Javascript新手! :)
  • 没问题,我加了一点解释。 @Marcooz2007
【解决方案2】:

这里有几个指针:

  • 您的条件包含未定义的变量arr。你一直在使用array

  • 你的数组必须是array = [1,2,3]

  • 我建议将您的变量 arrayFirst, mid, arraySecond 实例化为 const const mid = ...,以便它们是块作用域而不是全局变量

编辑:您似乎修改了arr 条件。请避免编辑,因为这会使答案变得无关紧要。

【讨论】:

    【解决方案3】:

    你正在使用array.splice(0, array[mid])

    array[mid]是数组中的值,你需要减去元素的数量array.splice(0, mid)splice docs

    索引也从 0 开始,所以你的 array[mid] 是第 6 个元素,而不是中间。

    【讨论】:

      【解决方案4】:

      一些变化:

      • 通过返回 1 或 0 或 1 加上带有子数组的调用结果在函数内部进行计数。

      • 提前检查长度(拼写很重要...arr)并为无法访问的值返回零。

      • 使用Array#slice而不是Array#splice(防止突变)并获取索引,而不是项目的值。

      • 最后返回一加左侧或右侧的计数。

      function binarySearch(array, number) {
          console.log(...array);
          var mid = Math.floor(array.length / 2);
        
          if (number === array[mid]) return 1;
          if (array.length <= 1) return 0;
      
          return number < array[mid]
              ? 1 + binarySearch(array.slice(0, mid), number)
              : 1 + binarySearch(array.slice(mid), number);
      }
      
      console.log('count:', binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 4));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 2022-11-25
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多