よく見る解法1 単純な分岐
単純にif文で分岐しているやりかた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 分岐を少なく
条件式を少なくするというアプローチ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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つで決まるので個人的には結構気に入ってる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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で書いてみたけど可読性はそれほど良くならなかった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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の非同期処理で使用したりする。