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は使い方を覚える例題にいいなあ…。