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

如何用递归方法查找数组中最后一个0的位置?

解决递归查找数组最后一个0的位置问题

你当前的代码逻辑是找到第一个0就终止递归,这和“找最后一个0”的目标完全相反。要实现需求,我们需要遍历完整个数组后,再回溯记录最后出现的0的位置,或者在递归过程中传递并更新当前找到的最大索引。下面给你两种可行的实现方案:

方案一:递归回溯记录位置

把方法返回值改为int,用-1表示未找到0。先递归遍历到数组末尾,再回溯时检查当前元素是否为0,最终返回最靠后的0的索引:

// 假设数组a是类的成员变量,也可以作为参数传入方法
public static int findLastZero(int i) {
    // 递归终止:遍历到数组末尾,返回-1表示当前路径无0
    if (i == a.length) {
        return -1;
    }
    // 先递归处理下一个元素
    int lastPos = findLastZero(i + 1);
    // 回溯判断:如果当前元素是0,且后面没找到0,就返回当前索引;否则返回后面找到的位置
    if (a[i] == 0) {
        return lastPos == -1 ? i : lastPos;
    } else {
        // 当前不是0,直接返回后面找到的结果
        return lastPos;
    }
}

调用示例:int result = findLastZero(0);,针对你给出的数组{2,3,4,5,0,1,2,0,5,0},会返回9(最后一个0的索引);如果数组无0,返回-1。

方案二:传递当前最大索引(带状态的递归)

在递归参数中携带当前已找到的0的最大位置,每次递归更新这个状态,最终返回结果:

public static int findLastZero(int i, int currentMaxPos) {
    if (i == a.length) {
        return currentMaxPos;
    }
    // 当前元素是0则更新最大索引,否则保持原状态
    int newMaxPos = a[i] == 0 ? i : currentMaxPos;
    // 递归处理下一个元素,传递更新后的状态
    return findLastZero(i + 1, newMaxPos);
}

调用示例:int result = findLastZero(0, -1);,初始currentMaxPos设为-1,逻辑和方案一一致。

思路总结

递归的核心是“先深入到底,再回溯处理”或者“逐步传递状态”,你之前的代码过早终止递归,所以无法找到最后一个0。多写几个小递归案例,慢慢就能适应这种“遍历全量再处理”的逻辑,别着急,递归思维需要一点时间打磨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:15:40