プリントの指示に忠実な実装を試みた:
Java
1public class Trial {
2
3 public static int gcd(int x, int y) {
4 // y が 0 ならば x が最大公約数である
5 if ( y == 0 ) {
6 return x;
7 }
8 // それ以外(y!=0)ならば次の処理を繰り返す:
9 else {
10 // x をy で割った余りをrに代入する
11 int r = x % y;
12 // x を y で置き換え、
13 x = y;
14 // さらに y を r で置き換えて
15 y = r;
16 // 最大公約数 gcd を求め直す(変数 a に gcd(x,y) を代入
17 int a = gcd(x, y);
18 return a;
19 }
20 }
21
22 // おためし: gcd(28,42) = 14 が得られるかな?
23 public static void main(String[] args) {
24 System.out.printf("gcd(28,42) = %d\n", gcd(28,42));
25 System.out.printf("gcd(42,28) = %d\n", gcd(42,28));
26
27 }
28}
※ 「次の処理を繰り返す」とあるからループを描いたんだろうけど、
"再帰を用いて"とあるから「再帰によってループと同じ効果を得る」ってこと。
だから関数gcd(x,y)にはループが現れない。
[追記] 上記コードをきっちきちに詰めて書くと:
Java
1public class Trial {
2
3 public static int gcd(int x, int y) {
4 // y == 0 のとき: gcd(x,y) = x
5 // そうでないとき: y と、xをyで割った余りrの最大公約数gcd(y,r)に等しい
6 return y == 0 ? x : gcd(y, x%y);
7 }
8
9 public static void main(String[] args) {
10 System.out.printf("gcd(28,42) = %d\n", gcd(28,42));
11 System.out.printf("gcd(42,28) = %d\n", gcd(42,28));
12
13 }
14}