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

递归实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:42:24