web-dev-qa-db-fra.com

Fonction factorielle intégrée à Haskell

Je sais que cela ressemble à une question stupide, mais la voici: y a-t-il un factoriel intégré à Haskell?

Google me donne des tutoriels sur Haskell expliquant comment je peux l'implémenter moi-même, et je n'ai rien trouvé sur Hoogle. Je ne veux pas le réécrire chaque fois que j'en ai besoin.

Je peux utiliser product [1..n] en remplacement, mais existe-t-il un vrai Int -> Int fonction factorielle intégrée?

36
Simon Bergot

Même si elle est couramment utilisée pour des exemples, la fonction factorielle n'est pas du tout utile dans la pratique. Les nombres augmentent très rapidement et la plupart des problèmes qui incluent la fonction factorielle peuvent (et devraient) être calculés de manière plus efficace.

Un exemple trivial est le calcul des coefficients binomiaux. S'il est possible de les définir comme

choose n k = factorial n `div` (factorial k * factorial (n-k))

il est beaucoup plus efficace de ne pas utiliser de factorielles:

choose n 0 = 1
choose 0 k = 0
choose n k = choose (n-1) (k-1) * n `div` k 

Donc, non, ce n'est pas inclus dans le prélude standard. La séquence de Fibonacci, la fonction Ackermann ou de nombreuses autres fonctions qui, bien que théoriquement intéressantes, ne sont pas suffisamment utilisées dans la pratique pour justifier une place dans les bibliothèques standard ne le sont pas non plus.

Cela étant dit, il existe de nombreuses bibliothèques mathématiques disponibles sur Hackage .

52
hammar

La meilleure implémentation de factorielle que je connaisse dans Hackage est Math.Combinatorics.Exact.Factorial.factorial dans le exact-combinatorics paquet. Il utilise un algorithme asymptotiquement plus rapide que product [1..n].

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

6
K. Takusagawa

Non, mais vous pouvez facilement en écrire un. Si vous êtes inquiet de devoir réécrire la fonction chaque fois que vous en avez besoin, vous pouvez toujours l'écrire dans le cadre d'un module ou d'une bibliothèque (selon la distance que vous souhaitez parcourir, le nombre d'autres fonctions similaires que vous avez). De cette façon, vous n'avez besoin de l'écrire qu'une seule fois et pouvez rapidement l'intégrer à tout autre projet lorsque vous en avez besoin.

5
Justin Ethier

Essayez Hayoo! rechercher (lien en haut du hackage); il est venu avec cela, par exemple

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

4
gatoatigrado
fac = product . flip take [1..]
3
Christian Brolin

Vous avez la fonction product qui est dans le prélude standard. Combiné avec des gammes, vous pouvez obtenir une fonction factorielle avec un minimum d'effort.

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
2
alopez

Si vous recherchez une expression lambda, vous pouvez toujours utiliser la classique fix (\f x -> if x == 0 then 1 else x * (f (x - 1))).

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

Vous pouvez choisir soit

0
Chandan Kumar