我知道这听起来像是一个愚蠢的问题,但这里是:Haskell中是否有内置的阶乘?
Google给了我关于Haskell的教程,解释了我如何自己实现它,而且我在Hoogle上找不到任何东西。我不想在每次需要时重写它。
我可以使用product [1..n]
作为替代,但是有一个真正的Int -> Int
阶乘内置函数吗?
答案 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函数或许多其他函数虽然在理论上很有用但在实践中并不常用,以保证标准库中的位置。
答案 1 :(得分:5)
不,但你可以轻松写一个。如果您担心每次需要时都必须重写该功能,您可以随时将其作为模块或库的一部分进行编写(取决于您想要采用它的程度,以及您拥有的其他类似功能)。这样你只需要编写一次,并且可以在需要时快速将其拉入任何其他项目。
答案 2 :(得分:5)
我在Hackage中知道的最好的factorial实现是Math.Combinatorics.Exact.Factorial.factorial
包中的exact-combinatorics
。它使用渐近比product [1..n]
更快的算法。
答案 3 :(得分:4)
试试Hayoo!搜索(链接在hackage顶部);它提出了这个,例如
答案 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]
您可以选择