Haskell中内置的阶乘函数

时间:2011-07-24 13:04:40

标签: haskell factorial

我知道这听起来像是一个愚蠢的问题,但这里是:Haskell中是否有内置的阶乘?

Google给了我关于Haskell的教程,解释了我如何自己实现它,而且我在Hoogle上找不到任何东西。我不想在每次需要时重写它。

我可以使用product [1..n]作为替代,但是有一个真正的Int -> Int阶乘内置函数吗?

8 个答案:

答案 0 :(得分:48)

尽管它通常用于示例,但是在实践中,阶乘函数并不是那么有用。数字增长得非常快,包括因子函数在内的大多数问题可以(并且应该)以更有效的方式计算。

一个简单的例子是计算二项式系数。虽然可以将它们定义为

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 

所以,不,它不包含在标准前奏中。 Fibonacci序列,Ackermann函数或许多其他函数虽然在理论上很有用但在实践中并不常用,以保证标准库中的位置。

话虽如此,但有many math libraries available on Hackage

答案 1 :(得分:5)

不,但你可以轻松写一个。如果您担心每次需要时都必须重写该功能,您可以随时将其作为模块或库的一部分进行编写(取决于您想要采用它的程度,以及您拥有的其他类似功能)。这样你只需要编写一次,并且可以在需要时快速将其拉入任何其他项目。

答案 2 :(得分:5)

我在Hackage中知道的最好的factorial实现是Math.Combinatorics.Exact.Factorial.factorial包中的exact-combinatorics。它使用渐近比product [1..n]更快的算法。

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

答案 3 :(得分:4)

试试Hayoo!搜索(链接在hackage顶部);它提出了这个,例如

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

答案 4 :(得分:3)

fac = product . flip take [1..]

答案 5 :(得分: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

答案 6 :(得分:0)

如果您正在寻找lambda表达式,那么您始终可以使用经典fix (\f x -> if x == 0 then 1 else x * (f (x - 1)))

答案 7 :(得分:0)

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

您可以选择