You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:40:20