4 votes

Définir la fonction squarefact::Int -> Int qui calcule pour tout entier positif n la factorielle au carré (n !)^2 == (1 * ...* n)^2

J'essaie de définir une fonction qui calcule, pour tout entier positif, le carré de sa factorielle.

(Je suis un débutant en Haskell, tout conseil ou aide est apprécié).

J'ai essayé plusieurs méthodes différentes : une qui me semble fonctionner et une autre dont je ne comprends pas pourquoi elle ne fonctionne pas.

Je crois que cette fonction fonctionne :

 squarefact:: Int -> Int
 squarefact 0 = 1
 squarefact n = n * n * squarefact(n-1)

Fonction Je ne comprends pas pourquoi ça ne marche pas :

squarefact:: Int -> Int
squarefact 0 = 1
squarefact n = (n * squarefact(n-1) ) * (n * squarefact(n-1) )

Une explication et un parcours des fonctions définies m'aideraient à mieux les comprendre, merci.

4voto

chi Points 8104

L'équation

squarefact n = (n * squarefact(n-1) ) * (n * squarefact(n-1) )

peut être réécrit en notation mathématique comme suit

(n!)^2 = n * ((n-1)!)^2 * n * ((n-1)!)^2

mais cette identité est incorrecte. Le côté droit comprend des facteurs 1,2,....,n-1 quatre au lieu de deux seulement, comme dans la partie gauche.

En comparaison,

squarefact n = n * n * squarefact(n-1)

est correcte, puisque des deux côtés, tous les facteurs apparaissent exactement deux fois.

2voto

Will Ness Points 18581

Une fonction factorielle peut être définie en Haskell comme suit

factorial n = product [1..n]

(où product est une fonction qui calcule le produit de tous les nombres d'une liste donnée).

D'où,

squarefact n = square (factorial n) =
  = square (product [1..n])
  = product [1..n] * product [1..n]
  = 1 * 2 * 3 * ... * (n-1) * n *
    1 * 2 * 3 * ... * (n-1) * n
  = product [1..(n-1)] * n * product [1..(n-1)] * n
  = n * n * square (product [1..(n-1)])
  = n * n * squarefact (n-1)

Les réécritures d'égalité se décomposent comme suit n=0 ( squarefact 0 /= 0 * 0 * squarefact (-1) ), elle doit donc être traitée comme un cas particulier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X