저는 이제 막 Haskell에 대해 알아보기 시작했습니다. 순진한 피보나치 구현을 작성했고 또한 더 고급 기능을 작성했습니다. 효율성을 위해 꼬리 호출 재귀를 사용합니다.

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) 

정확성 및 관용적 사용에 대한 리뷰에 감사드립니다.

댓글

  • 순진한 피보나치 함수를 구현하는 목적은 무엇입니까? 그 한계에 대해 잘 알고 있습니까? 보다 효율적인 피보나치 알고리즘에 대해 잘 알고 있습니까?
  • Haskell wiki에는 다양한 피보나치 구현에 대한 기사가 있습니다. wiki.haskell.org/The_Fibonacci_sequence

답변

mainfirstNumberFrom는 통합 될 수 있습니다.

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

fibbonacci"의 명시 적 재귀 iterate에 의해 캡처 됨 :

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

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다