我正在进行二进制搜索,这是我想出的第一件事:
function letsGoBinary(firstArray,array,search){
const middle = Math.floor(array.length / 2);
if(search === array[middle]) {
const rv = firstArray.indexOf(array[middle]);
return rv
}else if(search < array[middle]){
var lowerArray = []
for(var i = 0; i < middle; i++){
lowerArray.push(array[i])
}
letsGoBinary(firstArray,lowerArray, search)
}else if(search > array[middle]){
var forwardArray = []
for(var i = middle + 1; i < array.length; i++){
forwardArray.push(array[i]);
}
letsGoBinary(firstArray,forwardArray,search)
}else {
return -1
}
}
console.log(letsGoBinary([1,4,7,14,16],[1,4,7,14,16], 4))
并且如果我在第一个if语句(console.log()
)中添加search === array[middle]
并记录rv
,它将记录精确值,并且如果我在else语句中记录not found
,也会记录但记录[ C0]的值未定义。我该如何解决?
除了您的问题,请检查slice方法的工作原理,循环不是获取数组一部分的必要条件
如果使用],此代码也没有意义。>
letsGoBinary
然后为什么一开始就不使用
const rv = firstArray.indexOf(array[middle])
这一行代码使所有二进制搜索作为一个搜索元素变得毫无意义
有非常简单的解决方案
const rv = firstArray.indexOf(search)
在进行递归调用的情况下,您需要返回结果。
[在处理递归函数时,您应该具有基本的情况,然后,当您希望对perfom进行递归调用时,您不仅要再次调用该函数,还应返回该函数作为响应。例如,如果在LowerArray中存在搜索号,则意味着您应该返回letGoBinary(firstArray,lowerArray,search)作为答案。
发生这种情况是因为在第一次执行search === array [middle]之后,它完全从letGoBinary函数返回,因此您必须添加另一个return语句,请在下面的代码片段中找到: