簡體   English   中英

遞歸計算數組的標准差

[英]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遞歸。 您需要為此創建另一個“助手”方法 - sumSquareDiffs 該方法的簽名如下所示:

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

要實現該方法,請查看calcSum作用,並執行相同的操作,除了您需要添加而不是添加list.get(i)

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

有了這個方法,你就可以讓calcStd只依賴遞歸方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM