Java 級數求和、數列加總

題目:
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();
}