如何用递归方法查找数组中最后一个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
相关产品推荐
相关产品推荐

