Implementar búsqueda binaria recursiva en Python

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

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?