私は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

回答

mainと<の多くのアプローチdiv id = "e477e33254">

を統合できます:

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

fibbonacci"での明示的な再帰iterateによってキャプチャされます:

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です