为何JavaScript递归二分查找函数会返回undefined?
解决递归二分查找返回undefined的问题
嗨,我一眼就发现问题所在啦!你的递归调用分支里没有返回递归函数的执行结果,这就导致递归深层找到目标值后的返回值没法传递到最外层的函数调用,最后外层函数因为没有明确的返回语句,默认返回了undefined。
先看你代码里的这两段关键逻辑:
} else if(numbers[midpoint] < target) { recursiveBinarySearch(numbers.slice(midpoint+1), target); } else { recursiveBinarySearch(numbers.slice(midpoint-1), target); }
你只是调用了递归函数,但没把这个调用的结果return出去。当递归深层找到目标返回'FOUND'时,这个值只能回到上一层调用,但上一层没把它继续向上传递,就这么“丢了”,最后最外层的函数自然没有返回值,结果就是undefined。
另外还有个小细节:你else分支里的slice(midpoint-1)逻辑错误,slice(startIndex)会从startIndex开始取到数组末尾,这和你要取左半部分的需求完全相反,应该用slice(0, midpoint)来获取midpoint之前的所有元素。
修正后的完整代码如下:
const recursiveBinarySearch = (numbers, target) => { const midpoint = Math.floor(numbers.length / 2); // 边界处理:如果数组为空,说明没找到目标 if (numbers.length === 0) { return 'NOT FOUND'; } if (numbers[midpoint] === target){ return 'FOUND'; } else if(numbers[midpoint] < target) { // 加上return传递递归结果,同时取右半部分 return recursiveBinarySearch(numbers.slice(midpoint+1), target); } else { // 加上return传递递归结果,取左半部分 return recursiveBinarySearch(numbers.slice(0, midpoint), target); } } var result = recursiveBinarySearch([1, 2, 3, 4, 6, 8, 100] , 8); console.log(result); // 现在会正确输出'FOUND'
我还加了数组为空的边界判断,避免递归无限调用或者出现意外错误。这样修改后,递归的返回值就能一层一层传递回最外层,result就会正确拿到目标结果啦!
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

