未定义从函数返回

问题描述 投票:0回答:2

我正在进行二进制搜索,这是我想出的第一件事:

 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]的值未定义。我该如何解决?

javascript function recursion binary-search
2个回答
1
投票

除了您的问题,请检查slice方法的工作原理,循环不是获取数组一部分的必要条件

如果使用],此代码也没有意义。>

letsGoBinary

然后为什么一开始就不使用

const rv = firstArray.indexOf(array[middle])

这一行代码使所有二进制搜索作为一个搜索元素变得毫无意义

有非常简单的解决方案

const rv = firstArray.indexOf(search)

2
投票

在进行递归调用的情况下,您需要返回结果。


1
投票

[在处理递归函数时,您应该具有基本的情况,然后,当您希望对perfom进行递归调用时,您不仅要再次调用该函数,还应返回该函数作为响应。例如,如果在LowerArray中存在搜索号,则意味着您应该返回letGoBinary(firstArray,lowerArray,search)作为答案。


1
投票

发生这种情况是因为在第一次执行search === array [middle]之后,它完全从letGoBinary函数返回,因此您必须添加另一个return语句,请在下面的代码片段中找到:

© www.soinside.com 2019 - 2024. All rights reserved.