binarySearch找到最接近目标的数字。未定义为返回值

时间:2018-02-19 23:51:26

标签: javascript undefined binary-search

我正在研究一个函数,该函数应该从整数列表中将最接近的较小数字返回给目标。 (即[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 //获取=未定义。 :/

3 个答案:

答案 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