我知道这听起来像是一个愚蠢的问题,但是问题如下:Haskell 中是否有内置的阶乘函数?
谷歌给我提供了一些关于 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
所以,没有,在标准prelude中没有包括它。斐波那契数列、阿克曼函数或许多其他在理论上有趣但在实践中不常用的函数也没有被包含在标准库中。
话虽如此,Hackage上有许多数学库可用。
choose
是Test.QuickCheck包中的内置函数,因此即使在不使用Test.QuickCheck时此示例也可以工作,但最好将其命名为choose'
或完全不同的名称。 - lindhechoose
函数,这个函数被数学家们使用已经很久了。 - dfeuerexact-combinatorics
包中的Math.Combinatorics.Exact.Factorial.factorial
函数。它使用比product [1..n]
更快的渐近算法。
http://hackage.haskell.org/package/exact-combinatorics
fac = product . flip take [1..]
试试 Hayoo! 进行搜索(在 hackage 的顶部链接);例如,它可以找到如下内容:
您有一个名为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
fact n = if n == 0 then 1 else n * fact(n-1)
fact n = foldl(*) 1 [1..n]
fact n = product [1..n]
您可以选择以下任意一种方式
fix (\f x -> if x == 0 then 1 else x * (f (x - 1)))
。
maxBound :: Int
(2 ** 32或最多2 ** 64)的阶乘数字的数组即可更容易实现。 - user395760