如何编写JavaScript递归函数查找数组目标元素索引?当前函数返回undefined
递归函数无法返回目标元素索引的问题排查与解决
问题背景
需要将以下基于for循环实现的数组目标索引查找函数改写成递归版本,但当前编写的递归函数总是返回undefined:
原循环实现代码
function searchIndex(arr, target) { for(let i = 0; i < arr.length; i++) { if(arr[i] == target) { return arr.indexOf(target); } } return -1; }
待修复的递归代码
function searchRecursive(arr, target) { // base case if (arr[0] === target) { return 0; } else { searchRecursive(arr.slice(1), target) } }
问题排查
你的递归代码存在三个核心问题:
- 递归调用未传递结果:
else分支中调用递归函数时,没有用return将下层递归的结果向上传递,导致上层调用无法获取有效返回值,最终返回undefined。 - 缺少目标不存在的基准情况:当遍历完数组仍未找到目标时,没有对应的返回逻辑,递归会持续执行到数组为空,最终返回
undefined。 - 索引计算错误:每次截断数组后,下层递归返回的索引是相对于新子数组的,需要在上层递归中给结果加1,才能对应原数组的正确位置。
修复后的递归实现
function searchRecursive(arr, target) { // 基准情况1:数组为空,说明未找到目标 if (arr.length === 0) { return -1; } // 基准情况2:找到目标,返回当前子数组的起始索引(0) if (arr[0] === target) { return 0; } // 递归处理剩余子数组,若找到则修正索引后返回 const result = searchRecursive(arr.slice(1), target); return result === -1 ? -1 : result + 1; }
代码说明
- 新增数组为空的基准情况,直接返回
-1明确表示未找到目标。 - 递归调用时先接收下层返回结果,若结果不为
-1则加1,修正为原数组的索引位置。 - 所有分支都有明确的
return语句,确保递归结果能正确向上传递。
内容的提问来源于stack exchange,提问作者Luca Gilardenghi
相关产品推荐
相关产品推荐

