我正在开发一个函数,该函数应该从整数列表中返回最接近的较低数字到目标。 (即 [1,23,45,67,94,122],目标 = 96。应返回 94)。我已经多次检查我的代码,试图“捕获错误”,使该函数返回“未定义”,但我一直无法找出原因......当我通过该过程打印出我的变量时,它们都匹配我想要什么,但我的返回值仍然是未定义的。我在想我的问题出在前两个条件中,但是我仍然不知道为什么。有什么线索吗?
这是我的代码:
function binarySearch(arr,target){
var midpoint = Math.floor(arr.length/2);
if (arr[midpoint] === target){
return arr[midpoint];
}
if (arr.length === 1){
return arr[0];
}
if (arr[midpoint] > target){
binarySearch(arr.slice(0,midpoint),target);
}else if (arr[midpoint] < target){
binarySearch(arr.slice(midpoint),target);
}
}
binarySearch([1,23,45,67,94,122],96); => 预期返回值 = 94//获取 = 未定义。 :/
最佳答案
因此,原始算法似乎是错误的,选择小于目标的最大值,而不是在数值上最接近目标的值。
这是另一个版本,灵感来自 a java version ,但是是为 ES6 编写的,并且像问题的代码一样递归。
function binarySearch(arr, target, lo = 0, hi = arr.length - 1) {
if (target < arr[lo]) {return arr[0]}
if (target > arr[hi]) {return arr[hi]}
const mid = Math.floor((hi + lo) / 2);
return hi - lo < 2
? (target - arr[lo]) < (arr[hi] - target) ? arr[lo] : arr[hi]
: target < arr[mid]
? binarySearch(arr, target, lo, mid)
: target > arr[mid]
? binarySearch(arr, target, mid, hi)
: arr[mid]
}
console.log(binarySearch([1, 23, 45, 67, 94, 122], 96)) //=> 94
console.log(binarySearch([1, 23, 45, 67, 94, 122], 47)) //=> 45
console.log(binarySearch([1, 23, 45, 67, 94, 122], 207)) //=> 122
console.log(binarySearch([1, 23, 45, 67, 94, 122], 0)) //=> 1
关于javascript - 二进制搜索以查找最接近目标的数字。未定义为返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48875912/