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

JavaScript使用递归函数查找数组最小值结果异常如何排查

问题原因分析

你的代码存在两个问题导致结果不符合预期:

  • 核心逻辑错误:对splice方法的返回值理解错误
    Array.prototype.splice()的返回值是被删除元素组成的新数组,而非删除元素后的原数组。
    你传入测试用例[0,1]时,first=0、second=1,满足first < second进入else分支,执行ns.splice(1,1)会删除索引为1的元素1,返回值是[1],你直接将这个数组传入下一轮递归,自然直接返回1,和你想要保留0、传入[0]递归的预期完全相反。
  • 语法疏漏:你最后调用函数的代码少写了右括号,正确写法是minimum([0, 1])
修复后的代码

按照你原本的设计思路,只需要把else分支的传参改为删除第二个元素后剩余的数组即可,两种修改方案可选:

// 方案1:不用splice,用slice拼接得到删除索引1元素后的数组
function minimum(ns) {
    if (ns.length === 1) {
        return ns[0];
    }
    const first = ns[0]
    const second = ns[1]
    if (first >= second) {
        return minimum(ns.slice(1))
    } else {
        // 保留第一个元素,拼接从索引2开始的剩余元素
        return minimum([first, ...ns.slice(2)])
    }
}
// 方案2:如果坚持用splice,需要先执行splice修改原数组,再传入修改后的原数组
function minimum(ns) {
    if (ns.length === 1) {
        return ns[0];
    }
    const first = ns[0]
    const second = ns[1]
    if (first >= second) {
        return minimum(ns.slice(1))
    } else {
        // 先执行splice删除索引1的元素,splice会直接修改原数组ns
        ns.splice(1,1)
        // 传入修改后的原数组
        return minimum(ns)
    }
}
优化建议

递归找最小值还有更简洁的实现思路,不需要两两比较前两个元素:每次取第一个元素,和剩余数组的最小值比较,返回更小的那个即可,代码可读性更高:

function minimum(ns) {
    if (ns.length === 1) return ns[0]
    const restMin = minimum(ns.slice(1))
    return ns[0] < restMin ? ns[0] : restMin
}

内容的提问来源于stack exchange,提问作者Forrest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:04