今更ながら FizzBuzz問題 を解いてみる。今回はErlangで解いてみた。それだけだとつまらないので、それをC++のテンプレートで表現してみた。因みにErlangを使っているけど並列処理はしていない。 まずは普通に何の工夫もなく書いてみた。 -module(fizzbuzz). -export([fb/1]). fb(0) -> ok; fb(N) -> fb(N - 1), if N rem 15 =:= 0 -> io:put_chars("FizzBuzz"); N rem 3 =:= 0 -> io:put_chars("Fizz"); N rem 5 =:= 0 -> io:put_chars("Buzz"); true -> io:write(N) end, io:nl(). うーん、面白くない。どうせなら if をなくしてしまおう。というわけで、今度は以下のように書いた。 -module(fizzbuzz). -export([fb/3, fizzbuzz/1]). fb(_, 0, 0) -> io:put_chars("FizzBuzz\n"); fb(_, 0, _) -> io:put_chars("Fizz\n"); fb(_, _, 0) -> io:put_chars("Buzz\n"); fb(N, _, _) -> io:write(N), io:nl(). fizzbuzz(0) -> ok; fizzbuzz(N) -> fizzbuzz(N - 1), fb(N, N rem 3, N rem 5). 少しは関数型プログラミングっぽいかなぁ? これをC++のテンプレートで書いてみると以下のようになる。 #include <iostream> template<int N, int M3, int M5> struct FB { FB() { std::cout << N ...