我的程序怎么了?它总是返回“未找到”

时间:2019-06-10 06:05:18

标签: javascript

在以下位置检查我的问题:  https://github.com/harishsambasivam/SearchingAlgorithms/blob/master/BinarySearch-RecursiveMethod.js

function BinarySearch(low, high, key, arr) {
  if (low > high) return 'Not Found';
  if (low === high) {
    if (arr[low] === key) return "Found";
    else return "Not found";
  } else {
    var mid = Math.abs((low + high) / 2);
    if (arr[mid] === key) return "Found";
    else if (arr[mid] > key) return BinarySearch(low, mid - 1,
      key, arr);
    else return BinarySearch(mid + 1, high, key, arr);
  }
}

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(BinarySearch(0, 7, 5, arr));

我希望同时找到“找到”和“未找到”,但仅返回“未找到”。

4 个答案:

答案 0 :(得分:2)

我认为主要问题在于您的中间价值计算。

console.log(Math.abs((0 + 7) / 2)) //==> 3.5

对于下一次迭代,该值为小数点/ w。您可以先解决它。

您可以通过以下方法解决此问题: Math.trunc((min + high) / 2);

答案 1 :(得分:2)

您应该在使用Math.abs时使用Math.floor,这就是为什么它不起作用的原因。这里使用Math.abs是没有意义的,因为lowhigh总是非负的。

function BinarySearch(low, high, key, arr) {
  if (low > high) return 'Not Found';
  if (low === high) {
    if (arr[low] === key) return "Found";
    else return "Not found";
  } else {
    var mid = Math.floor((low + high) / 2);
    if (arr[mid] === key) return "Found";
    else if (arr[mid] > key) return BinarySearch(low, mid - 1,
      key, arr);
    else return BinarySearch(mid + 1, high, key, arr);
  }
}

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(BinarySearch(0, 7, 5, arr));

答案 2 :(得分:0)

通过引用此链接https://stackoverflow.com/a/596503/6517783

,您可以使用其他数学函数代替Math.floor

function BinarySearch(low, high, key, arr) {
  if (low > high) return 'Not Found';
  if (low === high) {
    if (arr[low] === key) return "Found";
    else return "Not found";
  } else {
    var mid = Math.floor((low + high) / 2);
    if (arr[mid] === key) return "Found";
    else if (arr[mid] > key) return BinarySearch(low, mid - 1,
      key, arr);
    else return BinarySearch(mid + 1, high, key, arr);
  }
}

let arr = [1, 2, 3, 4, 5, 6, 7, 8];
console.log(BinarySearch(0, 7, 5, arr));

答案 3 :(得分:0)

此处为中值,您将获得以十进制表示的值,该值不能选择任何arr [mid]元素。因此,为此,您可以根据需要将math.abs更改为math.floor / math.ceil