Shootout/Ack

From HaskellWiki
Jump to navigation Jump to search

A Shootout entry for the ackermann function

Code

All the following entries have the same performance. The difference is loc. The idea is to beat the SML entry of 4 loc. Performance is already excellent.

Interestingly, all run much faster when compiled with -fasm.

Proposal

-- http://shootout.alioth.debian.org/
-- shortened by Bryn Keller, Einar Karttunen and Don Stewart

import System

main = getArgs >>= \[n] -> putStrLn . (("Ack(3,"++n++"): ")++) . show . ack 3 $ read n
 
ack (0::Int) (n::Int) = n+1
ack  m        n       = ack (m-1) $ if n == 0 then 1 else ack m (n-1)

Original entry

7 loc

{-# OPTIONS -O2 -fasm #-}
-- $Id: ackermann-ghc.code,v 1.27 2006/01/08 22:44:56 igouy-guest Exp $
-- http://shootout.alioth.debian.org/
-- shortened by Bryn Keller and Einar Karttunen

import System(getArgs)

main = do ~[num] <- getArgs
          putStrLn ("Ack(3," ++ num ++ "): " ++ (show (ack 3 (read num))))

ack :: Int -> Int -> Int
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))