Haskellのお勉強(3) アッカーマン関数

再帰の例

久しぶりにHaskellのお勉強。昔々何かの本で読んだアッカーマン関数を思い出して書いてみたよ。もちろん関数の定義なんて覚えてないんで、ググって調べたよ。アッカーマン関数 - Wikipedia

import System.Environment   
import Text.Printf

ackermann 0 y = y + 1
ackermann x 0 = ackermann (x - 1) 1
ackermann x y = ackermann (x - 1) $ackermann x (y - 1)

main = do
    args <- getArgs
    let n = read(args !! 0)::Int
    let m = read(args !! 1)::Int
    printf "ackermann(%v,%v) = %v\n" n m $ackermann n m

Haskellだとこの手のものは本当にすっきり書けるね。と言うかこういうことをやりたくて作られた言語なんだろうね。
手続き型プログラミングばっかりやってると、関数型言語は考え方が大きく違うから難しく感じちゃうよね。脳を一回リセットしないと駄目だ。

~/haskell$ runghc ackermann.hs 3 3
ackermann(3,3) = 61
~/haskell$

動かしてみたらちゃんと計算されたよ。アッカーマン関数は計算量が急激に増えてくタイプの関数なんだけど、試しに4,1で試してみたらすぐには終わらなかったよ。Wikipediaによると65533になるらしいけど終わるの待てなくてctl-c押しちゃった。