web-dev-qa-db-ja.com

Haskellの組み込み階乗関数

私はこれが愚かな質問のように聞こえることを知っていますが、ここにあります:Haskellに組み込みの階乗はありますか?

GoogleからHaskellに関するチュートリアルが提供され、自分で実装する方法が説明されています。Hoogleでは何も見つかりませんでした。必要になるたびに書き直したくありません。

使うことができます product [1..n]代わりに、真のInt -> Int階乗組み込み関数?

36
Simon Bergot

例として一般的に使用されていますが、階乗関数は実際にはそれほど役に立ちません。数値は非常に急速に増加し、階乗関数を含むほとんどの問題は、より効率的な方法で計算できます(計算する必要があります)。

自明な例は、二項係数の計算です。それらを次のように定義することは可能ですが

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で利用できる多くの数学ライブラリ があります。

52
hammar

Hackageで知っている階乗の最良の実装は、Math.Combinatorics.Exact.Factorial.factorialパッケージのexact-combinatoricsです。 product [1..n]よりも漸近的に高速なアルゴリズムを使用します。

http://hackage.haskell.org/package/exact-combinatorics

6
K. Takusagawa

いいえ。ただし、簡単に作成できます。必要になるたびに関数を書き換える必要がある場合は、モジュールまたはライブラリの一部としていつでも関数を記述できます(これをどの程度まで実行するか、他に同様の関数をいくつ持つかによって異なります)。そうすれば、一度書くだけで、必要なときにすぐに他のプロジェクトに取り込むことができます。

5
Justin Ethier

ハヨウを試してみてください!検索する(ハッキングの上部にあるリンク);たとえばこれが思いついた

http://hackage.haskell.org/packages/archive/statistics/latest/doc/html/Statistics-Math.html#v:factorial

4
gatoatigrado
fac = product . flip take [1..]
3

標準のプレリュードにある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
2
alopez

ラムダ式を探している場合は、常に従来のfix (\f x -> if x == 0 then 1 else x * (f (x - 1)))を使用できます。

0
sanjoyd
fact n = if n == 0 then 1 else n * fact(n-1)
fact n = foldl(*) 1 [1..n]
fact n = product [1..n]

あなたはどちらかを選ぶことができます

0
Chandan Kumar