Implementar búsqueda binaria recursiva en Python

Clase 31 de 49Curso Práctico de Python: Creación de un CRUD

Contenido del curso

Básicos del Lenguaje

Estructuras de Datos

Uso de objetos y módulos

Resumen

Implementar búsqueda binaria en Python es más simple de lo que parece. Aquí verás cómo construir una función recursiva clara, preparar una lista ordenada con random y list comprehension, y gestionar el punto de entrada del programa. Todo con buenas prácticas y explicaciones directas.

¿Cómo preparar el entorno en Python para binary search?

Antes de codificar, se crea un archivo y se define el punto de ingreso con el keyword if name == "main". Luego, se generan datos aleatorios y se ordenan, porque la búsqueda binaria requiere una lista previamente ordenada.

  • Crear el archivo y definir el punto de entrada.
  • Importar el módulo random.
  • Generar 10 números entre 0 y 100 con list comprehension.
  • Ordenar la lista con sort para modificarla en sitio.
  • Imprimir los datos como guía visual.

¿Cómo generar y ordenar datos con random y list comprehension?

Se evita escribir un for loop manual usando list comprehension. La lista se ordena con sort; recuerda que sort modifica la lista y sorted crea una nueva.

import random if __name__ == "__main__": data = [random.randrange(0, 100) for _ in range(10)] data.sort() print("Datos ordenados:", data)

¿Qué diferencia hay entre sort y sorted?

  • sort: ordena en el lugar y no devuelve una nueva lista.
  • sorted: devuelve una copia ordenada y no altera la original.

Usar sort aquí simplifica el flujo y garantiza que la estructura requerida por el algoritmo esté lista.

¿Cómo se define la función recursiva binary search en Python?

La interfaz establece el contrato: recibe la lista ordenada, el target y dos índices, low y high, que representan el estado actual de búsqueda. Devuelve True si encuentra el elemento y False si no.

¿Cuál es la interfaz y el caso base?

El caso base valida si low > high: significa que se recorrió todo el rango posible y el número no está en la lista. Se evita así un error de fuera de índice y se detiene la recursión.

def binary_search(data, target, low, high): if low > high: return False # se completará más abajo

¿Cómo calcular el índice medio y decidir los tres casos?

Se calcula el índice medio con división entera: mid = (low + high) // 2. Luego se evalúan tres escenarios:

  • Igualdad: target == data[mid] → encontrado.
  • Menor: target < data[mid] → buscar en la mitad izquierda: high = mid - 1.
  • Mayor: en el lado derecho: low = mid + 1.
def binary_search(data, target, low, high): if low > high: return False mid = (low + high) // 2 if target == data[mid]: return True elif target < data[mid]: return binary_search(data, target, low, mid - 1) else: return binary_search(data, target, mid + 1, high)

¿Cómo ejecutar el script y qué reto propone el instructor?

Tras ordenar, se pide al usuario el número a buscar con input y se convierte a entero con int, ya que input devuelve cadenas. El resultado se imprime indicando si se encontró o no. En pruebas, se vieron casos donde el número sí está y otros donde no está, validando la implementación.

¿Cómo interactúa el usuario con input y conversión a int?

Se captura el objetivo y se llama a la función con índices correctos: low = 0 y high = len(data) - 1.

if __name__ == "__main__": data = [random.randrange(0, 100) for _ in range(10)] data.sort() print("Datos ordenados:", data) target = int(input("What number would you like to find? ")) found = binary_search(data, target, 0, len(data) - 1) print(found)

¿Qué ejercicio extra se sugiere sin recursión?

Se propone implementar la misma lógica sin recursión, usando ciclos para actualizar low y high. Es un gran ejercicio para reforzar el manejo de estado, comparaciones y división entera.

¿Te animas a compartir tu versión iterativa con ciclos y contar qué decisiones tomaste al actualizar los índices?