空飛ぶチンアナゴの統計解析日記

統計解析を嗜むチンアナゴのメモ帳です

STATAで解くFizzBuzz問題


みんな大好きFizzBuzz問題をSTATAでもやってみようという話
FizzBuzzってなんぞやという方は、下記のwikipediaを見てください
ja.wikipedia.org

お品書き

今日のルール

  1. 1から50までのランダムな数字が与えられます
  2. 与えられた数字まで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ならではの解法なんかも別途考えてみると良いでしょう。