limitusus’s diary

主に技術のことを書きます

Ackermann関数を書いてみた

  • 授業でAckermann関数が出てきて、それが関数型っぽい感じだったので、ちょこっとだけ勉強したHaskellで書いてみました。
  • ソースは追記。経験がないのでひどいコードかもしれませんがご容赦><
  • まだHaskellのデータ構造は詳しく勉強していないので、表を作るなどはでき
  • ていません><
    • 2009/02/24 22:34atoiはやめてreadにしました!(Thanks: yuki_neko)
    • (!!) :: [a] -> Int -> a を教えてもらいました!(Thanks: yuki_neko)

コンパイルと実行

% ghc ackermann.hs -o ackermann
% time ./ackermann 1 2
4
./ackermann 1 2  0.00s user 0.00s system 201% cpu 0.004 total
% time ./ackermann 3 8
2045
./ackermann 3 8  0.28s user 0.00s system 99% cpu 0.281 total
% time ./ackermann 4 0
13
./ackermann 4 0  0.00s user 0.00s system 101% cpu 0.004 total
% time ./ackermann 4 1
65533
./ackermann 4 1  732.07s user 1.22s system 99% cpu 12:17.23 total

Source

--ackermann.hs
import System
import Char

predecessor :: Integer -> Integer
predecessor 0 = 0
predecessor x = x - 1

ackermann :: Integer -> Integer -> Integer
ackermann 0 y = y + 1
ackermann x 0 = ackermann (predecessor x) 1
ackermann x y = ackermann (predecessor x) $ ackermann x (predecessor y)

main = do args <- getArgs
          let arg1 = args !! 0
          let arg2 = args !! 1
          putStrLn $ show $ ackermann (read arg1) (read arg2)