我需要计算数字的平均值。
例如: n = 123, 平均=(1 + 2 + 3)/ 3 = 2
到目前为止,我已设法正确计算总和,但我在获取数字的数量方面遇到问题,以便计算平均值。我会使用2个递归方法来计算数字的总和和数量,但我只允许使用1个递归方法。我也不被允许使用任何全局变量
arr = [{temp:36, night: false}, {temp:12, night: true}, {temp:24, night: true}];
config = {
propName: "night",
propVal: true
};
function findMatch(elt) {
return elt[this.propName] == this.propVal;
}
ind = arr.findIndex(findMatch.bind(config));
elt = arr[ind];
arr.splice(ind, 1); //Delete 1 element at position ind
答案 0 :(得分: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
,递增计数。
答案 1 :(得分:2)
这样的事情会起作用。
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 :(得分:0)
我喜欢为这样的案例编写一个前端方法,以帮助最终用户避免记住使用神奇的神秘值来获取递归所需的其他参数:
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。