代码之家  ›  专栏  ›  技术社区  ›  Linh Chi

如何调试用于二进制搜索的Javascript代码

  •  0
  • Linh Chi  · 技术社区  · 2 年前

    这段代码是用来实现二进制搜索的。但是,它不起作用,返回未定义。我不知道为什么会出问题,请帮帮我!

    function binarySearch(arr, key) {
      let low = 0;
      let high = arr.length - 1;
      let mid
      while (low <= high) {
        mid = Math.floor((high + low) / 2);
        if (arr[mid] == key) {
          return mid;
        } else if (arr[mid] < key) {
          high = mid - 1;
        } else if (arr[mid] > key) {
          low = mid + 1;
        }
      }
      // return -1
    }
    console.log(binarySearch([2, 3, 4, 10, 40], 10));
    2 回复  |  直到 2 年前
        1
  •  0
  •   selbie    2 年前

    我看到了这个bug,但我会给你一个机会先找到它。

    更新代码,以便为搜索循环的每个迭代都有一个附加的console.log语句。

    while (low <= high) {
        mid = Math.floor((high + low) / 2);
    
        // ADD THIS LINE
        console.log("low=", low, "high=", high, "mid=", mid, "arr[mid]=", arr[mid]);
    
        if (arr[mid] == key) {
          return mid;
        } else if (arr[mid] < key) {
          high = mid - 1;
        } else if (arr[mid] > key) {
          low = mid + 1;
        }
      }
    

    当您再次运行程序时,通过观察控制台输出,您会很快发现错误。

        2
  •  0
  •   Chris Barr    2 年前

    在每一步添加一些日志记录,这样你就可以看到它在发生什么。

    我不知道你在这里到底需要什么,但我知道只有一个地方你 return 一个永远不会被击中的值

    function binarySearch(arr, key) {
      let low = 0;
      let high = arr.length - 1;
      let mid
      while (low <= high) {
        mid = Math.floor((high + low) / 2);
        console.log(`key=${key}, low=${low}, mid=${mid}, high=${high}`)
        if (arr[mid] == key) {
          console.log('return mid', mid)
          return mid;
        } else if (arr[mid] < key) {
          console.log(`${arr[mid]} < ${key}`)
          high = mid - 1;
        } else if (arr[mid] > key) {
          console.log(`${arr[mid]} > ${key}`)
          low = mid + 1;
        }
      }
      // return -1
    }
    console.log(binarySearch([2, 3, 4, 10, 40], 10));