- 授業で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
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)