Concurrent Clean : たらいまわし関数

なんか、非正格言語であるのに、これを書いておかないのはまずい気がしてきた。といっても、Haskellとほとんど(全く?)同じなので、面白くも何ともないのだが。

module Main

import StdEnv

Start = tarai 768 340 0

tarai x y z | x <= y = y
                     = tarai (tarai (x-1) y z)
                             (tarai (y-1) z x)
                             (tarai (z-1) x y)

実行の結果

$ time ./Main.exe
768

real    0m0.098s
user    0m0.010s
sys     0m0.020s

マシンの性能差が効くよな。

      • -

これだけでは、何がどう面白いのかあまりにもわらかなさ過ぎるので、Perlと比較してみました。ソースは「404 Blog Not Found:たらいを回すならHaskell」のメモ化版を使って、perlはActivePerlを使いました。

$ time tarai.pl
tak(768, 340, 0) = 768

real    3m51.051s
user    0m0.010s
sys     0m0.080s

非力なマシンなので、途中でメモリが足りなくなって、HDDががりがり言い始めて、大丈夫かいなと思っていたら、4分ほどかかって計算終了。最近のマシンなら、これほど遅くはないと思うけど。