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押しちゃった。