Collatz Problem with Erlang

Facebook にシェア
このエントリーをはてなブックマークに追加
[`livedoor` not found]
Delicious にシェア

よく複数のプログラミングパラダイムを理解することは非常に良いことだと言われますが、
今回は関数型言語であるErlangでCollatz問題を実装してみました。
Erlangをさわるのは今回が初めてになります。実装に際しては、評判の良かった戦闘機本を読みました。

普段使用している言語であれば、あっさり実装出来そうな(完全解決出来ていない問題なので、プログラム上の意味)仕様でさえも、かなりの時間が掛かってしまいました。
新しいパラダイムを理解するのは非常に大変だと実感できました。また、並行処理を実装する・理解するまではもっと訓練が必要そうです。

● 仕様
Nが1以上256未満の整数のとき、Nに対して関数fを有限回繰り返し適用すると1になることを示す。

【Collatz問題とは】
問題の概要は、「任意の0でない自然数 n をとり、
n が偶数の場合、n を 2 で割る
n が奇数の場合、n に 3 をかけて 1 を足す
という操作を繰り返すと、有限回で 1 に到達する」という主張である(1 に到達すると、1→4→2→1 を繰り返す)。

-module(hoge).
-export([f/1]).

f(X) when is_integer(X), (X >= 1), (X < 256) -> collatz(X);
f(_X) -> io:format("This function can use Integer and under 256.n").

collatz(1) -> 1;
collatz(X) when (X rem 2 == 0) -> collatzEn(X);
collatz(X) when (X rem 2 == 1) -> collatzOn(X).

collatzEn(X) ->
    io:format("~p~n", [X]),
    collatz(X div 2).

collatzOn(X) ->
    io:format("~p~n", [X]),
    collatz(X * 3 + 1).

● 実行方法・結果

  1. 実行環境
  2. OS: CentOS5.6
    Ver: Erlang R12B-5.12
    Emu: Erlang emulator Ver5.6.5

  3. 実行方法・結果
  4. $erlcによってコンパイルすると、hoge.beamが生成されます。
    その後、erlコマンドでEmulatorを起動し、実装したCollatz関数を呼び出すと、最終的に1となります。

    [shmachid@hoge work]$ erlc hoge.erl
    [shmachid@hoge work]$ erl
    Erlang (BEAM) emulator version 5.6.5  [64-bit] [smp:2] [async-threads:0] [hipe] [kernel-poll:false]
    
    Eshell V5.6.5  (abort with ^G)
    1> hoge:f(13).
    13
    40
    20
    10
    5
    16
    8
    4
    2
    1
    2>