递归计算数组的标准差
Calculating Standard Deviation of Array Recursively
我的作业是使用递归来计算Arraylist 的标准偏差。我了解如何计算标准偏差,因为我没有递归就完成了我只需要帮助实现递归。如果可能的话,我想使用辅助函数。
这是我用来计算平均值的递归方法和辅助方法:
public static double calcAvg( ArrayList <Integer> list ) {
double sum = calcSum(list, 0);
return sum / list.size();
}
private static int calcSum( ArrayList <Integer> list, int i ) {
if( i < list.size() ){
return list.get(i) + calcSum(list, i + 1);
}
return 0;
}
这是我的需要递归的标准偏差方法:
public static double calcStd (ArrayList <Integer> list){
int sum = 0;
double average = calcAvg(list);
for ( int i : list){
sum += Math.pow((i - average), 2);
}
return Math.sqrt( sum / ( list.size() - 1 ));
}
尝试:
public static double calcStd( ArrayList <Integer> list){
double avg = calcAvg(list);
double sum = sumSquareDiffs(list, avg, 0);
return Math.sqrt( sum / ( list.size() - 1 ));
}
private static double sumSquareDiffs(ArrayList <Integer> list, double avg, int i){
if (i < list.size()){
return Math.pow((list.get(i) - avg), 2) + sumSquareDiffs(list, avg, i + 1);
}
return 0;
}
看看 calcSum
的递归定义,看看如何使 calcStd
也递归。您需要为此创建另一个 "helper" 方法 - sumSquareDiffs
。该方法的签名如下所示:
double sumSquareDiffs(ArrayList <Integer> list, double avg, int i) {
...
}
要实现该方法,请查看 calcSum
的作用,并执行相同的操作,除了您需要添加
而不是添加 list.get(i)
Math.pow((list.get(i) - avg), 2)
有了这个方法,您就可以 calcStd
只依赖递归方法。
我的作业是使用递归来计算Arraylist 的标准偏差。我了解如何计算标准偏差,因为我没有递归就完成了我只需要帮助实现递归。如果可能的话,我想使用辅助函数。
这是我用来计算平均值的递归方法和辅助方法:
public static double calcAvg( ArrayList <Integer> list ) {
double sum = calcSum(list, 0);
return sum / list.size();
}
private static int calcSum( ArrayList <Integer> list, int i ) {
if( i < list.size() ){
return list.get(i) + calcSum(list, i + 1);
}
return 0;
}
这是我的需要递归的标准偏差方法:
public static double calcStd (ArrayList <Integer> list){
int sum = 0;
double average = calcAvg(list);
for ( int i : list){
sum += Math.pow((i - average), 2);
}
return Math.sqrt( sum / ( list.size() - 1 ));
}
尝试:
public static double calcStd( ArrayList <Integer> list){
double avg = calcAvg(list);
double sum = sumSquareDiffs(list, avg, 0);
return Math.sqrt( sum / ( list.size() - 1 ));
}
private static double sumSquareDiffs(ArrayList <Integer> list, double avg, int i){
if (i < list.size()){
return Math.pow((list.get(i) - avg), 2) + sumSquareDiffs(list, avg, i + 1);
}
return 0;
}
看看 calcSum
的递归定义,看看如何使 calcStd
也递归。您需要为此创建另一个 "helper" 方法 - sumSquareDiffs
。该方法的签名如下所示:
double sumSquareDiffs(ArrayList <Integer> list, double avg, int i) {
...
}
要实现该方法,请查看 calcSum
的作用,并执行相同的操作,除了您需要添加
list.get(i)
Math.pow((list.get(i) - avg), 2)
有了这个方法,您就可以 calcStd
只依赖递归方法。