題目:
1 + 2 + 3 + 4 +…+ n = ?
這是由 1 開始,公差為 1 的等差級數
使用 for:
public int sum(int n) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
使用遞迴:
public int sum(int n) {
if (n > 0) {
return sum(n - 1) + n;
}
return 0;
}
使用公式:
高斯的梯形公式:(上底加下底)乘以高除以二
public int sum(int n) {
return (1 + n) * n / 2;
}
上述的算法寫死顯然不好
若題目換成 2 + 4 + 6 +…+ n 就錯了
因此還必須改寫
API
將首項、末項、公差皆寫成參數
使用 for:
public int sum(int first, int last, int commonDifference) {
int sum = 0;
for (int i = first; i <= last; i += commonDifference) {
sum += i;
}
return sum;
}
使用遞迴:
public int sum(int first, int last, int commonDifference) {
if (last > first) {
return sum(first, last - commonDifference, commonDifference) + last;
}
return first;
}
使用公式:
項數的算法:(大減小)除以公差後加一
public int sum(int first, int last, int commonDifference) {
int hight = (last - first) / commonDifference + 1;
return (first + last) * hight / 2;
}
因為參數是使用者自填
所以必須校驗
否則會產生非預期結果
例如:System.out.println(sum(2, 9, 3));
以上三種計算結果分別是 15、20、16
公差為 3 的級數應該是 2 + 5 + 8
使用者卻給了 9 所以造成程式運算出錯
因此在運算前必須先行判斷
if ((last - first) % commonDifference != 0) {
throw new IllegalArgumentException();
}