質問文でのコードは
f(x, y) = f(x, y - 1) + y
f(x, x) = x
の関係を使ってます。(y の方しか変化していきません)
x 側も変化する関係をコードにくみこむ必要があります。
f(n, n) = n
f(0, y) = f(0, y - 1 ) + y
f(x, 0) = f(x - 1, 0) + x
f(n, m) = m + f(n, m - 1) (m < n)
f(n, m) = n + f(n + 1, m) (m > n)
この関係をプログラムにしてみました。
lang
1import java.io.BufferedReader;
2import java.io.IOException;
3import java.io.InputStreamReader;
4
5public class Sample {
6
7 public static void main(String args[]) throws IOException {
8 BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
9 System.out.print("m=");
10 int m, n;
11 m = Integer.parseInt(a.readLine());
12 System.out.print("n=");
13 n = Integer.parseInt(a.readLine());
14 System.out.print("mからnまでの和=");
15 System.out.println(f(m, n));
16 }
17
18 public static int f(int m, int n) {
19 System.out.println("m=" + n + ", m=" + m);
20 if ( n == m) {
21 return n;
22 } else if (0 == m) {
23 return f(n - 1, 0) + n;
24 } else if (n == 0) {
25 return f(0, m - 1) + m;
26 } else if (m < n) {
27 return m + f(m + 1, n);
28 } else {
29 return m + f(m - 1, n);
30 }
31 }
32}
このコードでは f(1,4) も f(4,1) もどちらも 10 の値が求まりました。
別の考えかたもあります。
f(x, y) + f(y,x) を考えてみます。
x = 2, y = 3 とすると
f(2, 4) は図にすれば
OO
OOO
OOOO
f(4,2) は 図にすれば
XXXX
XXX
XX
これを 下のように組み合わせると
OOXXXX
OOOXXX
OOOOXX
つまり、f(2, 4) + f(4, 2) は長方形の面積になります。
長方形の面積は (4+1) * (abs(4-1) + 1) です。
f(x, y) = f(y, x) ですから、
f(x, y) + f(y, x)
= 2 * f(x, y)
= (x + y) * (abs(x - y) + 1)
つまり、
f(x, y) = (x + y) * (abs(x - y) + 1) / 2
と 直接 計算できます。