阿摩線上測驗 登入

申論題資訊

試卷:104年 - 104年關務人員、104年身心障礙人員、104年國軍上校以上軍官轉任考身障特考四等_資訊處理#29729
科目:程式設計
年份:104年
排序:0

申論題內容

四、參考 GradeBook.java, GradeBookTest.java 檔案,試以遞迴(recursive)方式重新撰寫
“GradeBook”class 內編號 31 行的 getAverage(),撰寫時必須遵循下列宣告:
public double getAverage(int n)
{

}
其中 n 為修課學生人數。(20 分)

詳解 (共 2 筆)

詳解 提供者:芷

public double getAverage(int n)

{

    if(n == 0)

        return grades[0];  //只有一個的時候 自己就是平均

     return (grades[n-1]+getAverage(n-1)*(n-1) ) / n;   

     // ( 自己 + 前面的平均*前面的個數 ) / 個數 

}

 

 

 

執行結果參考 :http://ideone.com/1g69oo

詳解 提供者:hchungw
為了使用遞迴方法重新撰寫 getAverage() 方法,我們需要修改其原始簽名以接受一個參數 n,表示目前考慮到的學生人數(或者準確地說,是 grades 數組中尚未處理的元素數)。以下是使用遞迴來計算平均成績的方法:
基本情況:如果 n 等於1,則返回最後一個(或唯一一個)元素的值,因為這時只剩一個成績,其平均值即為其本身的值。
遞迴步驟:如果 n 大於1,則計算前 n-1 個元素的總和加上第 n 個元素的值,然後除以 n 來獲得平均值。這裡,我們利用遞迴來獲得前 n-1 個元素的平均值,然後將其轉換為前 n 個元素的平均值。
由於原始的 getAverage() 方法不接受參數,我們可以保留這個方法作為一個對外的接口,然後在內部調用一個接受學生人數 n 為參數的遞迴方法。下面是遞迴方法的實現:
java

public double getAverage() {
    // 調用遞迴方法,初始時考慮全部學生
    return getAverage(grades.length);
}
private double getAverage(int n) {
    // 基本情況
    if (n == 1) {
        return grades[0];
    }
    // 遞迴步驟:計算前n-1個元素的平均值,然後利用這個平均值來計算前n個元素的平均值
    else {
        // 计算前n个元素的总和
        double totalUpToNMinusOne = getAverage(n - 1) * (n - 1);
        // 添加第n个元素的值,然后除以n以得到新的平均值
        return (totalUpToNMinusOne + grades[n - 1]) / n;
    }
}
這種方法利用遞迴計算平均值,每次遞減 n 直到基本情況,然後逐步返回並計算平均值。這種方法比較直观,但是需要注意,由於每次遞迴都計算前 n-1 個元素的平均值,這會導致重複計算,從而影響效率。在實際應用中,對於大數據集,非遞迴方法可能更為高效。