ErlangでFizzBuzz
今日はhttp://handasse.blogspot.com/2010/02/erlang.htmlを読んでたけど、ガードを使ってFizzBuzz問題を解く例がどうもうまくいきそうになかった。
fizzbuzz(N) when N rem 15 =:= 0 -> io:format("FizzBuzz~n"); fizzbuzz(N) when N rem 3 =:= 0 -> io:format("Fizz~n"); fizzbuzz(N) when N rem 5 =:= 0 -> io:format("Buzz~n"); fizzbuzz(N) -> io:format("~p~n", [N]).
1から100までなら、fizzbuzz(100)で実行とあったけど、それだと100について一度だけFizzBuzz判定して終わってしまうんじゃ…と。
それで補足した。
-module(fizzbuzz). -export([fizzbuzz/1]). fizzbuzz(0) -> ok; fizzbuzz(N) when N rem 15 =:= 0 -> fizzbuzz(N-1), io:format("FizzBuzz~n"); fizzbuzz(N) when N rem 3 =:= 0 -> fizzbuzz(N-1), io:format("Fizz~n"); fizzbuzz(N) when N rem 5 =:= 0 -> fizzbuzz(N-1), io:format("Buzz~n"); fizzbuzz(N) -> fizzbuzz(N-1), io:format("~p~n", [N]).
今度はif文でやってみた。
-module(fizzbuzz). -export([fizzbuzz/1]). fizzbuzz(0) -> ok; fizzbuzz(N) -> fizzbuzz(N-1), X = if N rem 15 =:= 0 -> fizzbuzz; N rem 3 =:= 0 -> fizz; N rem 5 =:= 0 -> buzz; true -> N end, io:format("~p~n", [X]).
case文で。
-module(fizzbuzz). -export([fizzbuzz/1]). fizzbuzz(0) -> ok; fizzbuzz(N) -> fizzbuzz(N-1), X = case {N,N rem 3,N rem 5} of {_,0,0} -> fizzbuzz; {_,0,_} -> fizz; {_,_,0} -> buzz; {N,_,_} -> N end, io:format("~p~n", [X]).
FizzBuzzは使い方を覚える例題にいいなあ…。