【问题标题】:How can I fix my Binary Search code not working as expected?如何修复我的二进制搜索代码未按预期工作?
【发布时间】:2023-02-21 20:40:53
【问题描述】:

我正在尝试在 javascript 中执行我的第一个二进制搜索。但是我看不出是什么阻碍了我从我的代码中获得我期望的结果。

这是我的代码:

function search(arr, target, start = 0, end = arr.length - 1) {
  if (start > end) {
    console.log('Not found!');
    return -1;
  }

  const middle = Math.floor((start + end) / 2);

  if (arr[middle] === target) {
    console.log(`${target} found at index ${middle}`);
    return middle;
  }

  if (arr[middle] > target) {
    return search(target, start, middle - 1);
  }

  if (arr[middle] < target) {
    return search(target, middle + 1, end);
  }

}

const arr = ['a', 'b', 'c', 'x', 'y', 'z'];
console.log(search(arr, 'b'));

所以当我运行上面的代码时,我的结果如下......

我越来越未找到!

我在期待什么b 在索引 1 处找到 1个

我对算法还很陌生,但我看不出这里发生了什么。即使只是从我遵循的指南中复制代码,我也会得到与老师得到的不同的结果。所以我认为一定有什么潜在的错误?

在此先感谢您抽出时间来帮助我!我正在努力学习并更好地理解这里。因此,如果我完全误解了这里显而易见的内容,请详细说明。

我在我的 Windows 10 机器上运行带有节点的程序,我使用的是 nodejs v18.14.1

【问题讨论】:

  • 查看参数以及您如何称呼它! function search(arr, target, start = 0, end = arr.length - 1)return search(target, start, middle - 1); 一个简单的 console.log 行就会告诉你发生了什么。 console.log(arr, target, start, end)

标签: javascript algorithm


【解决方案1】:

您的代码的问题是您没有将整个数组传递给 search 函数的递归调用。

在递归调用搜索函数的情况下,您只传递targetstartend参数,而不传递arr数组本身。因此,search 函数没有搜索整个数组,这导致它返回 'Not found!',即使数组中存在 target

尝试以下修复:

function search(arr, target, start = 0, end = arr.length - 1) {
  if (start > end) {
    console.log('Not found!');
    return -1;
  }

  const middle = Math.floor((start + end) / 2);

  if (arr[middle] === target) {
    console.log(`${target} found at index ${middle}`);
    return middle;
  }

  if (arr[middle] > target) {
    return search(arr, target, start, middle - 1);
  }

  if (arr[middle] < target) {
    return search(arr, target, middle + 1, end);
  }

}

const arr = ['a', 'b', 'c', 'x', 'y', 'z'];
console.log(search(arr, 'b'));

【讨论】:

    【解决方案2】:

    当您使用递归时,您会忘记添加 arr

    return search(arr, target, start, middle - 1);
    

    function search(arr, target, start = 0, end = arr.length - 1) {
      if (start > end) {
        console.log('Not found!');
        return -1;
      }
    
      const middle = Math.floor((start + end) / 2);
    
      if (arr[middle] === target) {
        console.log(`${target} found at index ${middle}`);
        return middle;
      }
    
      if (arr[middle] > target) {
        return search(arr, target, start, middle - 1);
      }
    
      if (arr[middle] < target) {
        return search(arr, target, middle + 1, end);
      }
    
    }
    
    const arr = ['a', 'b', 'c', 'x', 'y', 'z'];
    console.log(search(arr, 'b'));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2013-03-15
      • 2017-05-12
      • 2018-10-17
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      相关资源
      最近更新 更多