我正在研究一个函数,该函数应该从整数列表中将最接近的较小数字返回给目标。 (即[1,23,45,67,94,122],目标= 96.应返回94)。我已多次查看我的代码,试图捕获错误"这使得这个函数返回" undefined"而且我还没有找到原因......当我在整个过程中打印出我的变量时,它们都符合我想要的但我的返回值仍然是未定义的。我在想我的问题是在两个第一个条件中,但是,我仍然无法说明原因。任何线索?
这是我的代码:
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); =&GT;预期返回值= 94 //获取=未定义。 :/
答案 0 :(得分:1)
执行递归调用时需要添加return语句
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){
return binarySearch(arr.slice(0,midpoint),target);
}else if (arr[midpoint] < target){
return binarySearch(arr.slice(midpoint),target);
}
}
答案 1 :(得分:0)
我不认为您的算法会给出正确的结果。 您需要首先找到元素应插入的位置。 这是堆栈溢出链接: O(log n) algorithm to find best insert position in sorted array
function binarySearch(arr,target, l, h){
var midpoint = Math.floor(l+h/2);
if (arr[midpoint] === target){
return midpoint;
}
if (l === h){
return l;
}
if (arr[midpoint] > target){
return binarySearch(arr,target, l,midpoint);
}else if (arr[midpoint] < target){
return binarySearch(arr, target, midpoint,h);
}
}
function binaryclosest(arr, i){
x= abs(target - arr[i])
y = arr[i+1] - target
z = target - arr[i-1]
if(x<y && x<z){
return arr[i]
}
else{
if(y<z)
return arr[i+1]
else
return arr[i-1]
}
}
i = binarySearch(arr, target, l, h)
value = binaryclosest(arr, i)
然后,你应该减去i-1和i + 1取一个mod,然后返回较低者
答案 2 :(得分:0)
所以原始算法似乎是错误的,选择小于目标的最大值,而不是数值最接近目标的值。
这是另一个受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