La factorielle d’un entier non négatif n, notée n!, est le produit de tous les entiers positifs inférieurs ou égaux à n. Par exemple, 5! = 5 × 4 × 3 × 2 × 1 = 120. Les factorielles sont fondamentales en combinatoire et en probabilités. Cet article explore trois méthodes de calcul des factorielles en Python : l’itération, la récursion et la fonction optimisée math.factorial()
.
Table des matières
- Calcul des factorielles itérativement
- Calcul des factorielles récursivement
- Utilisation de la fonction
math.factorial()
- Comparaison des méthodes
Calcul des factorielles itérativement
L’itération offre une approche simple. Une boucle multiplie séquentiellement les nombres :
def factorial_iterative(n):
"""Calcule la factorielle d'un entier non négatif itérativement.
Args :
n : L'entier non négatif.
Returns :
La factorielle de n. Renvoie 1 si n est 0.
Lève une ValueError si n est négatif.
"""
if n < 0 :
raise ValueError("La factorielle n'est pas définie pour les nombres négatifs.")
elif n == 0 :
return 1
else :
result = 1
for i in range(1, n + 1) :
result *= i
return result
# Exemple
number = 5
result = factorial_iterative(number)
print(f"La factorielle de {number} est {result}") # Output : La factorielle de 5 est 120
Cette méthode est efficace et facile à comprendre, évitant les problèmes potentiels de dépassement de pile inhérents à la récursion.
Calcul des factorielles récursivement
La récursion fournit une alternative concise. Une fonction récursive s’appelle elle-même jusqu’à ce qu’un cas de base (n = 0, 0! = 1) soit atteint :
def factorial_recursive(n):
"""Calcule la factorielle d'un entier non négatif récursivement.
Args :
n : L'entier non négatif.
Returns :
La factorielle de n. Renvoie 1 si n est 0.
Lève une ValueError si n est négatif.
"""
if n < 0 :
raise ValueError("La factorielle n'est pas définie pour les nombres négatifs.")
elif n == 0 :
return 1
else :
return n * factorial_recursive(n - 1)
# Exemple
number = 5
result = factorial_recursive(number)
print(f"La factorielle de {number} est {result}") # Output : La factorielle de 5 est 120
Bien qu’élégante, la récursion peut être plus lente pour les grandes valeurs de n et peut atteindre la limite de profondeur de récursion de Python en raison de la pile d’appels croissante.
Utilisation de la fonction math.factorial()
Le module math
de Python offre une fonction factorial()
hautement optimisée :
import math
def factorial_math(n):
"""Calcule la factorielle en utilisant math.factorial().
Args :
n : L'entier non négatif.
Returns :
La factorielle de n.
Lève une ValueError si n est négatif ou n'est pas un entier.
"""
if not isinstance(n, int) or n < 0 :
raise ValueError("L'entrée doit être un entier non négatif.")
return math.factorial(n)
# Exemple
number = 5
result = factorial_math(number)
print(f"La factorielle de {number} est {result}") # Output : La factorielle de 5 est 120
Il s’agit de l’approche recommandée pour son efficacité, sa robustesse et sa gestion des grands nombres, tirant parti du code C optimisé.
Comparaison des méthodes
Bien que les méthodes itérative et récursive présentent une valeur pédagogique, math.factorial()
est généralement supérieure en termes de performances et de gestion des erreurs dans les applications pratiques. Le choix dépend du contexte : les objectifs pédagogiques peuvent privilégier les approches itérative ou récursive, tandis que le code de production bénéficie fortement de la fonction intégrée optimisée.