如何使用单一递归方法计算数字的平均值(禁用全局变量)
解决单个递归方法计算数字平均值的问题
我明白你现在的困境:要计算一个数字各位的平均值,已经能算总和,但没法在单个递归里同时获取位数,还不能用全局变量。先看看你原代码的问题:
你的原代码里,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
相关产品推荐
相关产品推荐

