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

如何使用单一递归方法计算数字的平均值(禁用全局变量)

解决单个递归方法计算数字平均值的问题

我明白你现在的困境:要计算一个数字各位的平均值,已经能算总和,但没法在单个递归里同时获取位数,还不能用全局变量。先看看你原代码的问题:

你的原代码里,sum 和 i 作为参数传递,但递归调用时,i++ 是在递归返回后执行的,这会导致位数计数完全错误——因为每次递归调用传递的 i 还是原来的值,上层的 i 不会随着下层递归的执行而更新。而且当 n==0 直接返回0,会让总和的计算逻辑断裂。

下面给你两种可行的解决方案,都只用一个递归方法,且不依赖全局变量:


方案一:用数组封装总和与位数

利用Java的数组是引用传递的特性,用一个长度为2的数组来同时存储总和(下标0)和位数(下标1),让递归方法直接操作这个数组:

public static double avg(int n) {
    // 处理n为0的特殊情况
    if (n == 0) {
        return 0.0;
    }
    int[] sumAndCount = new int[2]; // sumAndCount[0] = 总和,sumAndCount[1] = 位数
    return calculateAvgRecursive(n, sumAndCount);
}

private static double calculateAvgRecursive(int n, int[] sumAndCount) {
    if (n == 0) {
        // 递归终止,计算平均值
        return (double) sumAndCount[0] / sumAndCount[1];
    }
    // 累加当前位的数值
    sumAndCount[0] += n % 10;
    // 位数加1
    sumAndCount[1] += 1;
    // 递归处理剩余部分
    return calculateAvgRecursive(n / 10, sumAndCount);
}

调用示例:

double result = avg(123); // 返回2.0

方案二:用自定义类返回总和与位数

如果觉得数组不够直观,可以定义一个简单的类来封装总和和位数,让递归方法返回这个类的实例,最后计算平均值:

// 用来封装总和和位数的辅助类
static class SumCount {
    int sum;
    int count;
    SumCount(int sum, int count) {
        this.sum = sum;
        this.count = count;
    }
}

public static double avg(int n) {
    if (n == 0) {
        return 0.0;
    }
    SumCount sumCount = calculateSumCount(n);
    return (double) sumCount.sum / sumCount.count;
}

private static SumCount calculateSumCount(int n) {
    if (n == 0) {
        // 递归终止,返回初始的空值对象
        return new SumCount(0, 0);
    }
    // 递归获取剩余部分的总和与位数
    SumCount sc = calculateSumCount(n / 10);
    // 加上当前位的数值
    sc.sum += n % 10;
    // 位数加1
    sc.count += 1;
    return sc;
}

这两种方案都满足你的要求:只用一个递归方法,没有全局变量,能正确计算各位数字的平均值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:35:38