FizzBuzz(通常 / 再帰 / クラス)


はじめに

なんか書き殴りたくなったので書きます。

プログラム始めたばかりの時は、

「オブジェクト指向…??」

「再帰???」

みたいな印象だったのですが、気付いたら書けるようになってました。嬉しい。

備忘録的に残しておきます。
壮大なもの書こうかと思ったんですが、初心に帰ってFizzBuzzで

補足

①この記事では「これがFizzBuzzだ」みたいな話はしません
定義は下記に記しますがその定義があっているかどうかは議論しません。

②再帰的な書き方だったりクラスの書き方はもっと良い方法あると思います。
そんな時は是非マサカリが欲しいです。

定義
・1~100を順番に表示する
・3と5の倍数の場合[FizzBuzz]と表示する
・3の倍数の場合[Fizz]と表示する
・5の倍数の場合[Buzz]と表示する

通常ver

for (let i = 1; i <= 100; i++) {
  const Fizz = 3;
  const Buzz = 5;
  if (i % (Fizz * Buzz) === 0) {
    console.log(i, "FizzBuzz");
  } else if (i % Fizz === 0) {
    console.log(i, "Fizz");
  } else if (i % Buzz === 0) {
    console.log(i, "Buzz");
  } else {
    console.log(i);
  }
}

まぁ他にも書き方あると思いますがとりあえず次。

再帰ver

const FizzBuzz = (i, lastNum) => {
  const Fizz = 3;
  const Buzz = 5;
  if (i % (Fizz * Buzz) === 0) console.log(i, "FizzBuzz");
  if (i % Fizz === 0) console.log(i, "Fizz");
  if (i % Buzz === 0) console.log(i, "Buzz");
  if (i === lastNum) return;
  console.log(i);
  return FizzBuzz((i += 1), lastNum);
};

FizzBuzz(1, 100);

書いてから気付いたんですがFizzBuzzが再帰に向いてない気がする。
なんか書いてて再帰の良さみたいなものを表現できなかった…

クラスver

class CheckNumbers {
  constructor(i, Fizz, Buzz) {
    this.i = i;
    this.Fizz = Fizz;
    this.Buzz = Buzz;
  }

  main() {
    this.checkFizzBuzz();
    if (this.i === 100) return;
    return this.main((this.i += 1));
  }

  checkFizzBuzz() {
    if (this.i % (this.Fizz * this.Buzz) === 0) console.log(this.i, "FizzBuzz");
    if (this.i % this.Fizz === 0) console.log(this.i, "Fizz");
    if (this.i % this.Buzz === 0) console.log(this.i, "Buzz");
    if (this.i !== 100) console.log(this.i);
  }
}

new CheckNumbers(1, 3, 5).main();

なんかもっとよく書こうと書いてるうちに飽きてしまった…

もっとええ書き方あるで!っていう場合は是非教えてくださいm_ _m