Ik ben net begonnen Haskell te onderzoeken. Ik heb een naïeve Fibonacci-implementatie geschreven en ik heb ook een meer geavanceerde een die recursie van de staart gebruikt voor efficiëntie.
module Fibonacci where import System.Environment fibonacci :: Integer -> Integer fibonacci 0 = 0 fibonacci 1 = 1 fibonacci n | n < 0 = error "Cannot find a negative fibonacci number" | otherwise = fibonacci (n - 1) + fibonacci (n - 2) fibonacci" :: Integer -> Integer fibonacci" n | n < 0 = error "Cannot find a negative fibonacci number" | otherwise = fibHelper n 0 1 where fibHelper :: Integer -> Integer -> Integer -> Integer fibHelper n a b | n == 0 = a | otherwise = fibHelper (n - 1) b (a + b) firstNumberFrom :: [String] -> Integer firstNumberFrom [] = 10 firstNumberFrom args = read $ args !! 0 main = do args <- getArgs let num = firstNumberFrom args in putStrLn $ show (fibonacci" num)
Ik “zou alle beoordelingen over correctheid en idiomatisch gebruik op prijs stellen.
Opmerkingen
- Wat is uw doel achter het implementeren van een naïeve fibonacci-functie? Kent u de beperkingen ervan? Bent u bekend met efficiëntere fibonacci-algoritmen?
- De Haskell-wiki heeft een artikel met veel verschillende Fibonacci-implementaties: wiki.haskell.org/The_Fibonacci_sequence
Antwoord
De vele benaderingen in main
en firstNumberFrom
kan worden verenigd:
main = print . fibonacci" . maybe 10 read . listToMaybe =<< getArgs
De expliciete recursie in fibbonacci"
wordt vastgelegd door iterate
:
fibbonacci" n = fst $ iterate (\(a,b) -> (b, a+b)) (0,1) !! n