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

Java 如何递归计算数字的平均值,java,recursion,Java,Recursion,我需要计算数字的平均值 例如: 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);

我需要计算数字的平均值

例如: 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;
}

像这样的东西会有用的

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);
}
使用
平均值(123,0,0)
呼叫

在每次递归中,您将总和增加一位数,并将
i
增加1,作为位数的计数器。

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

另外,将平均值计算为
双精度
,以避免整数除法截断答案

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
以去掉一位数。对于
总和
,将最后一位数字添加到总和中。对于
i
,增加计数。

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

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。

能否使用
int
数组?这样,只需循环遍历数组,将总数相加,然后除以
array.size
?对于这个特定问题,我们不允许使用数组。对于1234的输入,正确答案应该是2.5。您的解决方案是2。@pjs,因为它返回一个
int
,情况就是这样。正如公认的答案所示,我们必须将其改为双倍。我不确定op是否需要它。