serious stuff
www.cubbi.com
personal
programming
fibonacci numbers
algorithms
benchmarks
forth examples
postscript examples
muf examples
joy examples
j examples
scheme examples
hope examples
ocaml examples
haskell examples
prolog examples
c++ examples
java examples
assembly language examples
fortran examples
c examples
sh examples
awk examples
perl examples
tcl examples
asmix
hacker test
resume
science
martial arts
fun stuff
www.cubbi.org
|
Haskell
Date: 1990
Type: Pure functional lazy evaluated language
Usage: rare example of a research language that has so many cool features that it's entering industry, it is now used in some computational and financial software
ALGORITHM 1A: NAIVE BINARY RECURSION |
module Main( main ) where
import System( getArgs )
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
f n = (if n<0 && even n then -1 else 1) * fib (abs n)
f_print n = print(show n ++ "th Fibonacci number is " ++ show (f n))
main = do
args <- getArgs
if (length args /= 1)
then putStr "Usage: f1a <n>"
else (f_print (read (head args)))
putStr "\n"
|
ALGORITHM 1B: CACHED BINARY RECURSION |
module Main( main ) where
import System( getArgs )
import Data.MemoTrie
fib :: Int -> Integer
fib 0 = 0
fib 1 = 1
fib n = mfib (n-2) + mfib (n-1) where mfib = memo fib
f n = (if n<0 && even n then -1 else 1) * fib (abs n)
f_print n = print(show n ++ "th Fibonacci number is " ++ show (f n))
main = do
args <- getArgs
if (length args /= 1)
then putStr "Usage: f1b <n>"
else (f_print (read (head args)))
putStr "\n"
|
ALGORITHM 2A: CACHED LINEAR RECURSION / INFINITE LAZY EVALUATED LIST |
module Main( main ) where
import System( getArgs )
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
f n = (if n<0 && even n then -1 else 1) * fibs!!abs n
f_print n = print(show n ++ "th Fibonacci number is " ++ show (f n))
main = do
args <- getArgs
if (length args /= 1)
then putStr "Usage: f2a <n>"
else (f_print (read (head args)))
putStr "\n"
|
ALGORITHM 2B: LINEAR RECURSION WITH ACCUMULATOR |
module Main( main ) where
import System( getArgs )
fib a b 0 = a
fib a b (c+1) = fib (a+b) a c
f n = (if n<0 && even n then -1 else 1) * fib 0 1 (abs n)
f_print n = print(show n ++ "th Fibonacci number is " ++ show (f n))
main = do
args <- getArgs
if (length args /= 1)
then putStr "Usage: f2b <n>"
else (f_print (read (head args)))
putStr "\n"
|
ALGORITHM 2C: NON-RECURSIVE LOOP |
Haskell does not support non-recursive loops.
Rewriting this algorithm in recursion produces ALGORITHM 2B.
|
ALGORITHM 3A: MATRIX MULTIPLICATION |
module Main( main ) where
import List( transpose )
import System( getArgs )
fib 0 = 0
fib (n+1) = let [[a,_],_] = power mm u t n in a
where u = [[1,0],[0,1]]
t = [[1,1],[1,0]]
f n = (if n<0 && even n then -1 else 1) * fib (abs n)
mm a b = [[sum$zipWith (*) row col | col <- transpose a] | row <-b]
power f u b n | n <= 0 = u
power f u b n | even n = power f u (f b b) (n `div` 2)
power f u b n | odd n = power f (f u b) (f b b) (n `div` 2)
f_print n = print(show n ++ "th Fibonacci number is " ++ show (f n))
main = do
args <- getArgs
if (length args /= 1)
then putStr "Usage: f3a <n>"
else (f_print (read (head args)))
putStr "\n"
|
ALGORITHM 3B: FAST RECURSION |
module Main( main ) where
import System( getArgs )
fib 0 = (0, 0)
fib 1 = (1, 0)
fib n | even n = ( (k1+k3)*k2, k1^2+k2^2 )
| odd n = ( k3^2+k2^2, (k1+k3)*k2 )
where (k2, k1) = fib$div n 2
k3 = k2 + k1
f n = (if n<0 && even n then -1 else 1) * (fst$fib$abs n)
f_print n = print(show n ++ "th Fibonacci number is " ++ show (f n))
main = do
args <- getArgs
if (length args /= 1)
then putStr "Usage: f3b <n>"
else (f_print (read (head args)))
putStr "\n"
|
ALGORITHM 3C: BINET'S FORMULA WITH ROUNDING |
module Main( main ) where
import System( getArgs )
import Data.Number.CReal
fib n = round (phi**x/(sqrt 5))
where phi = (1+sqrt 5)/2
x = (fromInteger n)::CReal
f n = (if n<0 && even n then -1 else 1) * fib (abs n)
f_print n = print(show n ++ "th Fibonacci number is " ++ show (f n))
main = do
args <- getArgs
if (length args /= 1)
then putStr "Usage: f3c <n>"
else (f_print (read (head args)))
putStr "\n"
|
|