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分ほどかかって計算終了。最近のマシンなら、これほど遅くはないと思うけど。