よく見る解法1 単純な分岐
単純にif文で分岐しているやりかた。
var NUM = 100 + 1
console.log("")
console.log(`-- case1 -----------------`)
for (var i = 1; i < NUM; i++) {
if (i % 15 === 0) {
console.log("fizzbuzz")
} else if (i % 3 === 0) {
console.log("fizz")
} else if (i % 5 === 0) {
console.log("buzz")
} else {
console.log(i);
}
}よく見る解法2 分岐を少なく
条件式を少なくするというアプローチ。
var NUM = 100 + 1
for (var i = 1; i < NUM; i++) {
var output = ""
if (i % 3 === 0) {
output += "fizz"
}
if (i % 5 === 0) {
output += "buzz"
}
if (output === "") {
output += i
}
console.log(output)
}
output宣言時はnullでもいいし何なら何も指定せずundefinedにしてもいい。
11行目に関しては if(!output) でも動作する。
今回はプログラム中にnull,undefinedを入れないように、そして比較はかなり厳密に実装している。
配列を使う
1~15までで一巡するので15の余剰を出して決め撃ちした値へマッピングしようともの。
あんまり見ないけどルール(ロジック)が変数1つで決まるので個人的には結構気に入ってる。
console.log("")
console.log(`-- case3 -----------------`)
var NUM = 100 + 1
var MAP = [
"", "", "fizz", "", "buzz",
"fizz", "", "", "fizz", "buzz",
"", "fizz", "", "", "fizzbuzz",
]
for (var i = 1; i < NUM; i++) {
var output = MAP[(i - 1) % 15]
if (output === "") {
output = i
}
console.log(output)
}
再帰でfizzbuzz
検索して最初にでてくるのがバグっているのはどうなのか(しかも再帰が一番シンプルでいいですねとか書いちゃってるし)
条件分岐はswitchで書いてみたけど可読性はそれほど良くならなかった。
var NUM = 100 + 1
console.log("")
console.log(`-- case4 -----------------`)
function fizzbuzz(n, end) {
if (n === end) {
return
} else {
var temp = n % 15
switch (temp) {
case 0:
console.log("fizzbuzz")
break;
case 3:
case 6:
case 9:
case 12:
console.log("fizz")
break;
case 5:
case 10:
console.log("buzz")
break;
default:
console.log(n);
break;
}
fizzbuzz(n + 1, end)
}
}
fizzbuzz(1, NUM)
この手のfor文を置き換えるタイプの再帰はPromise(async/await)が使えないJavaScriptの非同期処理で使用したりする。