Enumeración exhaustiva
Clase 12 de 31 • Curso de Introducción al Pensamiento Computacional con Python
Resumen
¿Qué es la enumeración exhaustiva en algoritmos?
La enumeración exhaustiva es una técnica algorítmica fundamental que consiste en verificar todas las posibles soluciones para encontrar una respuesta precisa. Aunque pueda parecer ineficiente, resulta ser una herramienta poderosa gracias a la velocidad con la que las computadoras pueden realizar cálculos hoy en día. Este algoritmo es especialmente útil como punto de partida al enfrentarse a nuevos problemas o en entrevistas de trabajo, donde lo importante es ir sacando soluciones de la manga de forma ágil.
¿Cómo aplicar la enumeración exhaustiva para encontrar raíces cuadradas?
Para ilustrar el uso de la enumeración exhaustiva, consideremos el problema de encontrar la raíz cuadrada exacta de un número. El proceso consiste en:
- Solicitar un número objetivo al usuario.
- Inicializar la respuesta en cero, considerando que comenzamos probando desde el inicio.
- Iterar incrementando la respuesta hasta que el cuadrado de la misma sea igual o superado por el número objetivo.
- Verificar el resultado: si el cuadrado de la respuesta coincide con el número objetivo, ese es el resultado; de lo contrario, no existe una raíz cuadrada exacta.
Este concepto puede ser plasmado de forma sencilla en Python:
objetivo = int(input("Elige un número: "))
respuesta = 0
while respuesta**2 < objetivo:
respuesta += 1
if respuesta**2 == objetivo:
print(f"La raíz cuadrada de {objetivo} es {respuesta}")
else:
print(f"{objetivo} no tiene una raíz cuadrada exacta")
¿Por qué no preocuparse por la eficiencia en este caso?
A veces, los desarrolladores novatos podrían pensar que probar cada posibilidad una por una resultaría muy lento. Sin embargo, las computadoras modernas son capaces de llevar a cabo millones de operaciones por segundo, lo que hace que la enumeración exhaustiva sea sorprendentemente rápida para muchos problemas prácticos. Incluso con números grandes, este método puede llegar al resultado en cuestión de milisegundos.
¿Cómo entender mejor el comportamiento del programa?
Una de las mejores formas de entender el comportamiento de un algoritmo es utilizando la impresión de estados intermedios dentro del ciclo. Esto se logra añadiendo declaraciones print()
para observar cómo se actualizan los valores internos del programa en cada iteración:
objetivo = int(input("Elige un número: "))
respuesta = 0
while respuesta**2 < objetivo:
print(f"Probando con {respuesta}")
respuesta += 1
if respuesta**2 == objetivo:
print(f"La raíz cuadrada de {objetivo} es {respuesta}")
else:
print(f"{objetivo} no tiene una raíz cuadrada exacta")
¿Cómo manejar números muy grandes?
La prueba con números extremadamente grandes puede dar lugar a dudas sobre la eficiencia. Sin embargo, como se mencionó anteriormente, las computadoras manejan estas situaciones sin apenas esfuerzo. Incluso al buscar la raíz cuadrada de números ridículamente grandes, como 108,638,929, el resultado puede obtenerse en un abrir y cerrar de ojos. Simplemente se trata de confiar en la eficiencia y rapidez de las máquinas actuales.
Practicando y aprendiendo más
No dudes en experimentar con el código, probar diferentes números y realizar modificaciones para entender a fondo cómo funciona la enumeración exhaustiva. Usar este algoritmo básico como cimiento te ayudará a desarrollar destrezas algorítmicas sólidas en el futuro. ¡Sigue practicando y haciendo preguntas, cada intento cuenta para mejorar tu comprensión computacional!