FizzBuzz問題の話の続きです。
前回は
3の倍数の時Fizz、5の倍数の時Buzz、7の倍数の時Pazz、11の倍数の時Wezzを表示し、複数の倍数を満たす場合はそれらの文字をすべて出力し、どの倍数も満たさない場合は数字を出力する。
という問題をどのようなプログラムで解くのが良いかという問いかけをしたところで終わりました。
いわゆるFizzBuzz問題で使った条件分岐だと、下記のように処理を描くことになりますが、条件分岐が非常に多く、実装・確認作業やメンテナンスが大変です。
==========
for (int i = 1; i <= 1000; i++) {
if (i % 3 == 0 && i % 5 == 0 && i % 7 == 0 && i % 11 == 0) {
System.out.println("FizzBuzzPazzWezz");
} else if (i % 3 == 0 && i % 5 == 0 && i % 7 == 0) {
System.out.println("FizzBuzzPazz");
} else if (i % 3 == 0 && i % 5 == 0&& i % 11 == 0) {
System.out.println("FizzBuzzWezz");
} else if (i % 3 == 0 && i % 7 == 0 && i % 11 == 0) {
System.out.println("FizzPazzWezz");
} else if (i % 5 == 0 && i % 7 == 0 && i % 11 == 0) {
System.out.println("BuzzPazzWezz");
} else if (i % 3 == 0 && i % 5 == 0) {
System.out.println("FizzBuzz");
} else if (i % 3 == 0 && i % 7 == 0) {
System.out.println("FizzPazz");
} else if (i % 3 == 0 && i % 11 == 0) {
System.out.println("FizzWezz");
} else if (i % 5 == 0 && i % 7 == 0) {
System.out.println("BuzzPazz");
} else if (i % 5 == 0 && i % 11 == 0) {
System.out.println("BuzzWezz");
} else if (i % 7 == 0 && i % 11 == 0) {
System.out.println("PazzWezz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else if (i % 7 == 0) {
System.out.println("Pazz");
} else if (i % 11 == 0) {
System.out.println("Wezz");
} else {
System.out.println(i);
}
}
==========
この煩雑さを解消するには、以下のようにプログラムを書くことで記述量も条件分岐の回数も減らすことができ、一気に分かりやすくなるのではないでしょうか。
==========
for (int i = 1; i <= 1000; i++) {
String str = "";
if (i % 3 == 0) {
str = str + "Fizz";
}
if (i % 5 == 0) {
str = str + "Buzz";
}
if (i % 7 == 0) {
str = str + "Pazz";
}
if (i % 11 == 0) {
str = str + "Wezz";
}
if (str.length() == 0) {
// 文字列の長さが0(7行目で初期化したまま)の場合
// どの数字の倍数でもない場合、出力文字列をiの値にする
str = String.valueOf(i);
}
System.out.println(str);
}
==========
学習し始めたばかりのエンジニアはString型でデータを持っておくことに気付けるかが大事です。
以上、単純なFizzBuzz問題だけだとプログラミングの考え方としては不足しているなとふと思った私の解説でした。