"Spiega perché questo algoritmo funziona."
def binary_search(lista, target):
  inferiore = 0 
  superiore = len(lista) - 1
    
  while inferiore <= superiore: 
    medio = (inferiore + superiore) // 2  # Divisione intera
    ipotesi = lista[medio]
    if ipotesi == target:
      return medio
    if ipotesi > target:
      superiore = medio - 1
    else: 
      inferiore = medio + 1
 
  return None
Questo algoritmo funziona utilizzando un approccio di divide et impera. Inizia dividendo la lista data in due parti e trova una posizione ottimizzata ripetutamente dimezzando la lista fino a quando l'elemento target non viene trovato. Questo approccio è vantaggioso perché riduce notevolmente il numero di confronti necessari per trovare il valore target. Se l'elemento non viene trovato, i limiti superiori e inferiori della ricerca diventano uguali, il che significa che l'elemento non esiste nella lista. Pertanto, l'algoritmo è garantito per trovare il target (se esiste) o restituire None se non esiste.