はじめに
- 以前に「【Java】Fizz Buzz問題を解いてみる」を投稿した後、もう少し別の書き方が出来ないかと考えていました。
- 「判定する数が1ずつ増えていく」という点に着目すると、再帰処理が使えそうだと思ったので試してみました。
作成したコード
- 最初の
if (end > 1) {...}という条件分岐で、end==1の時にはこれ以上再帰処理に入らないようにしています。 - 「最初のプレイヤーは『1』と数字を読み上げる」というFizzBuzzのルールに合致しています。
FizzBuzz2.java
/**
* 再帰処理を活用した方法。
* @param end FizzBuzzを終える数。
*/
public static void useRecursion(int end) {
if (end > 1) {
useRecursion(end - 1);
}
if (end%3==0 && end%5==0) {
System.out.println("Fizz Buzz");
} else if (end%3==0) {
System.out.println("Fizz");
} else if (end%5==0) {
System.out.println("Buzz");
} else {
System.out.println(end);
}
}
実行結果(※引数endに20を指定した時)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz
16
17
Fizz
19
Buzz
まとめ
- 再帰処理を活用してFizzBuzz問題を解くことができました。
- ただし引数
endが大きくなると、再帰処理(再帰関数)の呼び出し回数も大きくなるため、スタックオーバーフローの危険性が出てくると思います。