-- Some examples of functional programming for Gofer -- Factorials: fact n = product [1..n] -- a simple definition fac n = if n==0 then 1 else n * fac (n-1) -- a recursive definition fac' 0 = 1 -- using two equations fac' n = n * fac (n-1) facts = scanl (*) 1 [1..] -- the infinite list of factorials facts' = 1 : zipWith (*) facts' [1..] -- another way of doing it facFix = fixedPt f -- using a fixed point combinator where f g 0 = 1 -- overlapping patterns f g n = n * g (n-1) fixedPt f = g where g = f g -- fixed point combinator facCase = \n -> case n of 0 -> 1 (m+1) -> (m+1) * facCase m -- Fibonacci numbers: fib 0 = 0 -- using pattern matching: fib 1 = 1 -- base cases... fib (n+2) = fib n + fib (n+1) -- recursive case fastFib n = fibs !! n -- using an infinite stream where fibs = 0 : 1 : zipWith (+) fibs (tail fibs) cnkfib 1 = 1 -- using cnk patterns, in a form cnkfib 2 = 1 -- suggested by Tony Davie cnkfib (2*n) = (cnkfib(n+1))^^2 - (cnkfib(n-1))^^2 cnkfib (2*n+1) = (cnkfib(n+1))^^2 + (cnkfib n )^^2 x^^0 = 1 -- A fast implementation of x^^(2*n) = xn*xn where xn = x^^n -- exponentiation x^^(2*n+1) = x * x^^(2*n) -- Perfect numbers: factors n = [ i | i<-[1..n-1], n `mod` i == 0 ] perfect n = sum (factors n) == n firstperfect = head perfects perfects = filter perfect [1..] -- Prime numbers: primes = map head (iterate sieve [2..]) sieve (p:xs) = [ x | x<-xs, x `rem` p /= 0 ] -- Pythagorean triads: triads n = [ (x,y,z) | ns=[1..n], x<-ns, y<-ns, z<-ns, x*x+y*y==z*z ] -- The Hamming problem: hamming :: [Int] hamming = 1 : (map (2*) hamming || map (3*) hamming || map (5*) hamming) where (x:xs) || (y:ys) | x==y = x : (xs || ys) | x zipWith (+) ([0]++row) (row++[0])) [1] showPascal = (layn . map show . take 14) pascal