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

递归统计数组末尾连续零个数:全零数组计算错误问题

递归统计数组末尾连续零的问题修复

我想用递归方法统计数组末尾的连续零的个数,但遇到了问题:当数组所有元素均为0时,得到的结果不正确。我尝试过调整pos的范围设置为(0,v.length-1],也试过保留或移除其中一个条件,但问题仍未解决。

原代码

public static int Ejercicio22f(int[] v,int pos){
        if(pos<=v.length-1){
            if(v.length==0){return 0;}
            else if(v.length==1){
                if(v[v.length-1]!=0){return 0;}
                else{return 1;}
            } else{
                if(v[pos]==0 && pos>0){return 1+Ejercicio22f(v,pos-1);}
                else if(v[0]==0){return v.length;}
                else{return 0;}
            }
        } else{return Ejercicio22f(v, v.length-1);}
    }

问题分析

原代码的核心问题在于递归逻辑混乱、边界条件处理顺序错误:

  1. 空数组的判断被嵌套在pos<=v.length-1分支里,空数组时v.length-1=-1,初始pos如果不符合条件会陷入无效递归,永远触发不了空数组返回0的逻辑。
  2. 当递归到pos=0时,直接判断v[0]==0就返回数组长度,这种逻辑会误判非全零数组(比如[0,1,0]会被错误返回3,实际末尾只有1个0)。
  3. 没有明确的递归终止条件(比如pos越界时的处理),导致全零数组的递归逻辑无法正确累加所有元素。

修复后的代码

简化递归逻辑,核心思路是从数组末尾向前遍历,遇到0就累加计数,遇到非0或越界就终止递归:

// 对外调用的方法,无需手动传递pos参数
public static int countTrailingZeros(int[] v) {
    if (v == null || v.length == 0) {
        return 0;
    }
    // 从最后一个元素开始递归
    return countTrailingZerosRecursive(v, v.length - 1);
}

// 递归核心实现
private static int countTrailingZerosRecursive(int[] v, int pos) {
    // 终止条件:pos越界,说明前面所有元素都是0,返回0(前面已完成累加)
    if (pos < 0) {
        return 0;
    }
    // 当前元素是0,计数+1后递归检查前一个位置
    if (v[pos] == 0) {
        return 1 + countTrailingZerosRecursive(v, pos - 1);
    } else {
        // 当前元素非0,连续零中断,返回0
        return 0;
    }
}

逻辑说明

  • 重载方法countTrailingZeros负责处理空数组等边界情况,并初始化递归的起始位置(数组最后一个元素索引),用户调用更友好。
  • 递归方法countTrailingZerosRecursive的终止条件清晰:当pos<0时返回0,此时说明已经遍历完所有元素且全为0,前面的累加值正好是数组长度。
  • 遇到非0元素时直接返回0,中断递归链,前面累加的数值就是末尾连续零的个数。

测试验证:

  • 全零数组[0,0,0]:最终返回3,正确。
  • 数组[1,0,0]:返回2,正确。
  • 数组[0,1,0]:返回1,正确。
  • 空数组返回0,正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:27:23