みんな大好きFizzBuzz問題をSTATAでもやってみようという話
FizzBuzzってなんぞやという方は、下記のwikipediaを見てください
ja.wikipedia.org
お品書き
今日のルール
- 1から50までのランダムな数字が与えられます
- 与えられた数字までFizzBuzzのルールに則って表示してください
※ただし、ランダムな数字の発生装置も自分で作ってください
共通コード
乱数の発生
local i = runiformint(1, 50)
runiformint()関数で発生させましょう。
なお、これより先のコードでは、与えられた最大値は全てiを用いています。
FizzBuzzの表示
capture program drop display_fizzbuzz program define display_fizzbuzz args num if (mod(`num',15) ==0) { display "fizzbuzz" } else if (mod(`num',3) ==0) { display "fizz" } else if (mod(`num',5) ==0) { display "buzz" } else { display "`num'" } end
ありふれた3の倍数ならfizz、5の倍数ならbuzz、15の倍数ならfizzbuzz、それ以外なら数字をそのまま表示するコードなので説明は省略します。
Fizzbuzzのコード
Forvaluesを使ったコード
forvalues num = 1/`i' { display_fizzbuzz `num' }
Forループを用いた一番単純で分かり易いコード。
whileループを使ったコード
local num1 = 1 while `num1' < `i'+ 1 { display_fizzbuzz `num1' local num1 = `num1' + 1 }
whileループで記載するとこんな感じ
Forループで書くよりもちょっとめんどくさい
再帰で書く方法
capture program drop recursive_call program define recursive_call args num if (`num' > 0) { local num_next = `num' - 1 recursive_call `num_next' display_fizzbuzz `num' } end recursive_call `i'
再帰で書くとなかなかにコードが複雑。
ちなみに64個以上スタックに積んでしまうと
system limit exceeded - see manual
r(1000);
とエラーが出るので数が多い場合はどうやって処理を分割するかを考えなければいけません。
まとめ
STATAでもFizzBuzz問題は解くことは可能です。
FizzBuzz問題はさまざまな解法がありますので、STATAならではの解法なんかも別途考えてみると良いでしょう。