在以下位置检查我的问题: 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));
我希望同时找到“找到”和“未找到”,但仅返回“未找到”。
答案 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
是没有意义的,因为low
和high
总是非负的。
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
。