よく見る解法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の非同期処理で使用したりする。