[Haskell-beginners] Understanding cached fibonnacci function

Daniel Fischer daniel.is.fischer at web.de
Thu Jan 29 15:22:44 EST 2009


Am Donnerstag, 29. Januar 2009 20:29 schrieb Thomas Davie:
>
> The reason that the second one is slower is that ghc makes a
> distinction that so called CAFs (constant applicative forms) are
> likely to be constants, and evaluates them once.  Thus, your list (map
> fib [0..]) gets kept between runs.  In the second form though, ghc
> sees a function, and evaluates it every time it gets called, which
> makes it into an exponential time algorithm.

However, if you compile it with -O2, the optimiser sees it's better to keep 
the list and it's again a linear time algorithm.

>
> An aside:  fibs !! 0 is usually defined to be 1.

I meet fibs !! 0 == 0 more often.

>
> Here's another couple of definitions of fib for you to play with, and
> try and figure out the properties of:
> mfib :: Int -> Integer
> mfib = ((fibs  1 1) !!)
>
> fibs :: Integer -> Integer -> [Integer]
> fibs n m = n : fibs m (n+m)
>
> -- and
> fibs :: [Integer]
> fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
>
> Have fun

Not to forget the marvellous

import Control.Monad.Fix

fibs :: [Integer]
fibs = fix ((0:) . scanl (+) 1)

>
> Bob



More information about the Beginners mailing list