39

ばかげた質問のように聞こえるかもしれませんが、Haskell にはビルトインの階乗はありますか?

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

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

4

8 に答える 8

57

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

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

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 には多くの数学ライブラリが用意されています

于 2011-07-24T13:17:51.443 に答える
8

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

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

于 2016-04-17T09:59:21.447 に答える
5

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

于 2011-07-24T13:09:53.197 に答える
4
fac = product . flip take [1..]
于 2016-04-20T06:21:34.990 に答える
4

がんばれ!検索する (ハックの上部にあるリンク)。たとえば、これを思いついた

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

于 2011-07-25T00:24:04.003 に答える
2

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
于 2013-07-27T16:08:59.323 に答える
0

ラムダ式を探している場合は、いつでもクラシックを使用できますfix (\f x -> if x == 0 then 1 else x * (f (x - 1)))

于 2011-07-24T17:13:51.687 に答える