#!/usr/bin/runghc module Recursion09Fibonacci where -- This version is not efficient. -- It re-computes values it already computed fibRec :: Int -> Integer fibRec 0 = 0 fibRec 1 = 1 fibRec n = fibRec (n - 1) + fibRec (n - 2) -- The versions below are efficient: fibTail :: Integer -> Integer -> Integer -> Integer -> Integer fibTail n previous current i | i < n = fibTail n current (previous + current) (i + 1) | otherwise = previous fibWrapExternal :: Integer -> Integer fibWrapExternal n = fibTail n 0 1 0 fibWrapInternal :: Integer -> Integer fibWrapInternal n = let go n previous current i = if i < n then fibTail n current (previous + current) (i + 1) else previous in go 10 0 1 0 main :: IO () main = do print (fibRec 10) print (fibTail 10 0 1 0) print (fibWrapExternal 10) print (fibWrapInternal 10)