首页 文章

如何递归计算数字的平均值

提问于
浏览
2

我需要计算数字的平均值 .

例如:n = 123,平均=(1 2 3)/ 3 = 2

到目前为止,我已经设法正确计算总和,但我在获取数字的数量以计算平均值时遇到问题 . 我会使用2个递归方法来计算数字的总和和数量,但我只允许使用1个递归方法 . 我也不允许使用任何全局变量

public static int avg(int n, int sum, int i) {
    if(n==0)
        return 0;
    sum =  n%10+avg(n/10, sum, i);
    i++;
    return sum/i;
}

3 回答

  • 4

    不需要多个递归方法 . 您需要通过递归方法本身传递数字的总和和计数 . 因为你只能返回一个变量,所以让基本情况返回平均值是最简单的 .

    另外,将平均值计算为 double 以避免整数除法截断您的答案 .

    public static double avg(int n, int sum, int i) {
        if(n==0)
            return (double) sum / i;
        return avg(n / 10, sum + n % 10, i + 1);
    }
    

    基本情况返回总和除以到目前为止累积的计数 . 否则,对于数字 n ,传递 n / 10 以取消个位数 . 对于 sum ,将最后一位数添加到总和中 . 对于 i ,递增计数 .

  • 0

    像这样的东西会起作用 .

    public static double avg(int n, int sum, int i) {
        if(n==0)
            return (double) sum/i;
        return avg(n/10,sum + n%10,i+1);
    }
    

    avg(123,0,0) 调用 .
    对于每次递归,您将总和增加数字,并将 i 增加1作为位数的计数器 .

  • 2

    我喜欢为这样的案例编写一个前端方法,以帮助最终用户避免记住使用神奇的神秘值来获取递归所需的其他参数:

    private static double avg(int n, int sum, int count) {
        if(n == 0)
            return (double) sum / count;
        return avg(n / 10, sum + n % 10, count + 1);
    }
    
    public static double avg(int n) {
        if (n == 0)
            return 0.0;
        return avg(n, 0, 0);
    }
    

    这允许您为递归计算设置默认值,而不会将它们公开给公众 . 此版本还防止输入为0 .

相关问题