Je commence tout juste à me pencher sur Haskell. Jai écrit une implémentation naïve de Fibonacci, et jai également écrit une version plus avancée celui qui utilise la récursivité des appels finaux pour plus defficacité.

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) 

Japprécierais toutes les critiques sur lexactitude et lutilisation idiomatique.

Commentaires

  • Quel est votre but derrière limplémentation dune fonction fibonacci naïve? Connaissez-vous ses limites? Êtes-vous familier avec des algorithmes de fibonacci plus efficaces?
  • Le wiki Haskell a un article avec de nombreuses implémentations de Fibonacci différentes: wiki.haskell.org/The_Fibonacci_sequence

Réponse

Les nombreuses approches dans main et firstNumberFrom peut être unifié:

main = print . fibonacci" . maybe 10 read . listToMaybe =<< getArgs 

La récursivité explicite dans fibbonacci" est capturé par iterate:

fibbonacci" n = fst $ iterate (\(a,b) -> (b, a+b)) (0,1) !! n 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *