递归实现List中单词平均长度:除法位置困惑求助
递归计算列表中单词平均长度的解决方案
你遇到的问题核心在于:如果在递归的每一步都进行除法操作,会导致计算的是局部平均值的累加,而不是总字符数除以总单词数的真实平均值。正确的做法应该是先通过递归求出所有单词的总字符数,再一次性除以列表的总长度。
方法一:使用辅助函数计算总字符数
这是最直观的方案,拆分两个职责:一个递归函数负责统计总字符数,另一个函数负责计算平均值。
完整代码如下:
import java.util.List; public class RekursivWortlänge { // 辅助递归函数:计算列表中所有单词的总字符数 private static int totalStringLength(List<String> l) { if (l.isEmpty()) { return 0; } // 累加当前单词长度 + 剩余列表的总字符数 return l.get(0).length() + totalStringLength(l.subList(1, l.size())); } public static double avgStringLength(List<String> l) { if (l.isEmpty()) { // 处理空列表,避免除以零异常 return 0.0; } // 总字符数转换为double后除以单词总数,得到平均值 return (double) totalStringLength(l) / l.size(); } public static void main(String[] args) { List<String> words = List.of("Hallo", "Welt", "Java"); System.out.println(avgStringLength(words)); // 输出约4.333 } }
为什么这个方案可行?
totalStringLength函数通过递归逐步累加所有单词的长度,最终得到准确的总字符数。- 在
avgStringLength中只做一次除法操作,确保是总字符数除以总单词数,得到正确的平均值。
方法二:单递归函数同时追踪总和与数量(进阶)
如果你希望用一个递归函数完成,可以通过返回数组或自定义对象来同时传递总字符数和单词数量:
import java.util.List; public class RekursivWortlänge { public static double avgStringLength(List<String> l) { if (l.isEmpty()) { return 0.0; } double[] sumAndCount = calculateSumAndCount(l); return sumAndCount[0] / sumAndCount[1]; } // 返回数组:[总字符数, 单词数量] private static double[] calculateSumAndCount(List<String> l) { if (l.isEmpty()) { return new double[]{0, 0}; } double[] restResult = calculateSumAndCount(l.subList(1, l.size())); // 累加当前单词长度,数量+1 return new double[]{restResult[0] + l.get(0).length(), restResult[1] + 1}; } public static void main(String[] args) { List<String> words = List.of("Hallo", "Welt", "Java"); System.out.println(avgStringLength(words)); // 输出约4.333 } }
避免你的错误写法
不要在递归的返回语句中直接除法,比如这样的错误代码:
// 错误示例:每一步都除以当前列表长度,导致结果错误 public static double avgStringLength(List<String> l) { if (l.isEmpty()) { return 0; } return (l.get(0).length() + avgStringLength(l.subList(1, l.size()))) / l.size(); }
这种写法会让每个子列表的平均值都被按当前长度加权,最终结果不是真实的平均长度。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

