递归计算数组的标准偏差

时间:2015-03-13 00:13:09

标签: java recursion arraylist standard-deviation helper-functions

我的任务是使用递归来计算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;
}

1 个答案:

答案 0 :(得分:1)

查看calcSum的递归定义,看看如何使calcStd递归。你需要另一个帮助&#34;方法 - sumSquareDiffs。该方法的签名如下所示:

double sumSquareDiffs(ArrayList <Integer> list, double avg, int i) {
    ...
}

要实施此方法,请查看calcSum执行的操作,并执行相同操作,但不要添加list.get(i),而是需要添加

Math.pow((list.get(i) - avg), 2)

使用此方法,您可以使calcStd仅依赖递归方法。