為了使用遞迴方法重新撰寫 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 個元素的平均值,這會導致重複計算,從而影響效率。在實際應用中,對於大數據集,非遞迴方法可能更為高效。