Haskell中内置的阶乘函数

Sim*_*got 33 haskell factorial

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

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

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

ham*_*mar 49

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

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

choose n k = factorial n `div` (factorial k * factorial (n-k))
Run Code Online (Sandbox Code Playgroud)

不使用阶乘更有效率:

choose n 0 = 1
choose 0 k = 0
choose n k = choose (n-1) (k-1) * n `div` k 
Run Code Online (Sandbox Code Playgroud)

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

话虽这么说,Hackage上很多数学库.

  • 我理解这一点.但是当你计算东西时,使用诸如阶乘,二项式系数等规范函数来简化代码会很有用.我同意你每天都不需要这种功能,但仍然...... (5认同)
  • @Lindhea,Test.QuickCheck可能是你的工作流程(和其他人)的一个重要包,但它不拥有`choose`,数学家已经使用了很长时间. (4认同)
  • @lindhe 使用限定来消除歧义,而不是任意的名称扩展。 (2认同)

小智 6

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

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


Jus*_*ier 5

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