私はこれが愚かな質問のように聞こえることを知っていますが、ここにあります:Haskellに組み込みの階乗はありますか?
GoogleからHaskellに関するチュートリアルが提供され、自分で実装する方法が説明されています。Hoogleでは何も見つかりませんでした。必要になるたびに書き直したくありません。
使うことができます product [1..n]
代わりに、真のInt -> Int
階乗組み込み関数?
例として一般的に使用されていますが、階乗関数は実際にはそれほど役に立ちません。数値は非常に急速に増加し、階乗関数を含むほとんどの問題は、より効率的な方法で計算できます(計算する必要があります)。
自明な例は、二項係数の計算です。それらを次のように定義することは可能ですが
choose n k = factorial n `div` (factorial k * factorial (n-k))
階乗を使用しないほうがはるかに効率的です。
choose n 0 = 1
choose 0 k = 0
choose n k = choose (n-1) (k-1) * n `div` k
したがって、いいえ、それは標準のプレリュードには含まれていません。フィボナッチ数列、アッカーマン関数、または理論的には興味深いものの、実際には標準ライブラリでスポットを保証するのに十分に一般的に使用されていない他の多くの関数も同様です。
そうは言っても、 Hackageで利用できる多くの数学ライブラリ があります。
Hackageで知っている階乗の最良の実装は、Math.Combinatorics.Exact.Factorial.factorial
パッケージのexact-combinatorics
です。 product [1..n]
よりも漸近的に高速なアルゴリズムを使用します。
いいえ。ただし、簡単に作成できます。必要になるたびに関数を書き換える必要がある場合は、モジュールまたはライブラリの一部としていつでも関数を記述できます(これをどの程度まで実行するか、他に同様の関数をいくつ持つかによって異なります)。そうすれば、一度書くだけで、必要なときにすぐに他のプロジェクトに取り込むことができます。
ハヨウを試してみてください!検索する(ハッキングの上部にあるリンク);たとえばこれが思いついた
fac = product . flip take [1..]
標準のプレリュードにあるproduct
関数があります。範囲と組み合わせると、最小限の労力で階乗関数を取得できます。
factorial n = product [n, n-1 .. 1]
nCr n r = n' `div` r'
where
-- unroll just what you need and nothing more
n' = product [n, n-1 .. n-r+1]
r' = factorial r
ラムダ式を探している場合は、常に従来のfix (\f x -> if x == 0 then 1 else x * (f (x - 1)))
を使用できます。
fact n = if n == 0 then 1 else n * fact(n-1)
fact n = foldl(*) 1 [1..n]
fact n = product [1..n]
あなたはどちらかを選ぶことができます