El factorial de un entero no negativo n, denotado por n!, es el producto de todos los enteros positivos menores o iguales a n. Por ejemplo, 5! = 5 × 4 × 3 × 2 × 1 = 120. Los factoriales son fundamentales en combinatoria y probabilidad. Este artículo explora tres métodos para calcular factoriales en Python: iteración, recursión y la función optimizada math.factorial()
.
Tabla de contenido
- Calculando Factoriales Iterativamente
- Calculando Factoriales Recursivamente
- Usando la función
math.factorial()
- Comparación de Métodos
Calculando Factoriales Iterativamente
La iteración ofrece un enfoque sencillo. Un bucle multiplica secuencialmente los números:
def factorial_iterativo(n):
"""Calcula el factorial de un entero no negativo iterativamente.
Args:
n: El entero no negativo.
Returns:
El factorial de n. Devuelve 1 si n es 0.
Plantea ValueError si n es negativo.
"""
if n < 0:
raise ValueError("El factorial no está definido para números negativos.")
elif n == 0:
return 1
else:
result = 1
for i in range(1, n + 1):
result *= i
return result
# Ejemplo
numero = 5
resultado = factorial_iterativo(numero)
print(f"El factorial de {numero} es {resultado}") # Salida: El factorial de 5 es 120
Este método es eficiente y fácil de entender, evitando posibles problemas de desbordamiento de pila inherentes a la recursión.
Calculando Factoriales Recursivamente
La recursión proporciona una alternativa concisa. Una función recursiva se llama a sí misma hasta que se alcanza un caso base (n = 0, 0! = 1):
def factorial_recursivo(n):
"""Calcula el factorial de un entero no negativo recursivamente.
Args:
n: El entero no negativo.
Returns:
El factorial de n. Devuelve 1 si n es 0.
Plantea ValueError si n es negativo.
"""
if n < 0:
raise ValueError("El factorial no está definido para números negativos.")
elif n == 0:
return 1
else:
return n * factorial_recursivo(n - 1)
# Ejemplo
numero = 5
resultado = factorial_recursivo(numero)
print(f"El factorial de {numero} es {resultado}") # Salida: El factorial de 5 es 120
Si bien es elegante, la recursión puede ser más lenta para n grandes y podría alcanzar el límite de profundidad de recursión de Python debido a la creciente pila de llamadas.
Usando la función math.factorial()
El módulo math
de Python ofrece una función factorial()
altamente optimizada:
import math
def factorial_math(n):
"""Calcula el factorial usando math.factorial().
Args:
n: El entero no negativo.
Returns:
El factorial de n.
Plantea ValueError si n es negativo o no es un entero.
"""
if not isinstance(n, int) or n < 0:
raise ValueError("La entrada debe ser un entero no negativo.")
return math.factorial(n)
# Ejemplo
numero = 5
resultado = factorial_math(numero)
print(f"El factorial de {numero} es {resultado}") # Salida: El factorial de 5 es 120
Este es el enfoque recomendado por su eficiencia, robustez y manejo de números más grandes, aprovechando el código C optimizado.
Comparación de Métodos
Si bien los métodos iterativo y recursivo proporcionan un valor educativo, math.factorial()
es generalmente superior en rendimiento y manejo de errores en aplicaciones prácticas. La elección depende del contexto: los propósitos educativos podrían favorecer los enfoques iterativos o recursivos, mientras que el código de producción se beneficia enormemente de la función integrada optimizada.