追記)
FizzBuzz 問題は、様々な処理を訓練するものであり、「1つの回答例だけが正解」というものではありません。
ただ、問題文から「ベン図を想像できる」だけの知識があることが望ましい題材です。
- 1から100 の数 という矩形のグループ ... 反復処理(for, while)のブロックで表現
- 3で割り切れる という円(Fizz)のグループ ... if 文などで切り分ける
- 5で割り切れる という円(Buzz)のグループ ... 同上
- 2.3. の重なったグループ ... 同上
ご質問(疑問2)で示されるコードは正しく切り分けができていませんので、if文を再確認する必要があります。
if(条件a) { 処理A } .. モシ、「条件aが真」ナラ、「処理A」ヲジッコウ
else if(条件b) { 処理B } .. ソウジャナク、「条件bが真」ナラ、「処理B」ヲジッコウ
else { 処理C } .. ソウジャナイナラ、「処理C」ヲジッコウ(条件aも条件bも共に偽のとき)
javascrit
1for(var i = 1; i <= 100; i++ ){
2 //console.log(i); ... 割り切れるかどうかに関わらず、出力してしまっている
3 if(i % 3 ===0 && i % 5===0){
4 console.log("FizzBuzz");
5 } else if (i % 5 ===0){
6 console.log("Buzz");
7 } else if (i % 3 ===0) {
8 console.log("Fizz");
9 } else {
10 console.log( i )
11 }
12}
3の倍数「且つ」5の倍数の "&&" は、if文の中で先頭に書かないとダメなのでしょうか?
問題には要件として示されていませんので、「書かないと駄目」ということはありませんが、
ベン図を見ても分かるように、最も多くの条件を有した領域から消去法で if else を書く手法に過ぎません(重なっている部分を先に処理したほうが、あとで切り分けし直さなくて済むため)。
別段、以下のように、文字列の結合処理に着目した処理も正答です。
javascrit
1for(var i = 1; i <= 100; i++ ){
2 var rslt = "";
3 if (i % 3 ===0) rslt = "Fizz";
4 if (i % 5 ===0) rslt += "Buzz"
5 if (rslt === "") rslt += i; // その数字の代わりに表示. 数値でなく数字と示されている
6 console.log( rslt );
7}
※柔軟な考え方で様々な処理法がある問題ですので、「他人のコードを読む」、「他人にコードを読ませる」といった訓練に使われます。
(追記ここまで
A. 1
if文でelse を使っているからです。
A. 2
console.log(i) は割り切れるかどうかに関わらず、必ず出力しています。
有名な問題だけあって、検索するとヒットします
if を使わない例を書いてみました。
javascript
1for ( let i=1; i<=100; ++i ) {
2 let
3 Fizz = !(i % 3),
4 Buzz = !(i % 5),
5 Bit = (Fizz<<1) + Buzz,
6 out = !(Fizz + Buzz) ? i : (Fizz ? 'Fizz': '') + (Buzz ? 'Buzz': ''),
7 out2 = Object.entries({Fizz, Buzz})
8 .reduce((a,[k,v])=>(v ? isFinite(a) ? k : a+k : a),i),
9 out3 = [i,"Fizz","Buzz","FizzBuzz"][Bit]
10 ;
11 console.log( out, out2, out3 );
12}
主な確認事項:
2020/09/19 05:29 編集
2020/09/19 05:42