La Funzione 91 di McCarthy

No, il maccartismo non c’entra. Questo McCarthy (John) è l’informatico che ha realizzato il Lisp, oltre che essere un pioniere dell’intelligenza artificiale. La “Funzione 91” è una funzione ricorsiva definita sugli interi in questo modo:

$$ M(n) = \left\{\begin{matrix} n – 10, & \mbox{se }n > 100\mbox{ } \\ M(M(n+11)), & \mbox{se }n \le 100\mbox{ } \end{matrix}\right. $$

Notate come la ricorsione non sia semplice, come per esempio nel caso del fattoriale che possiamo definire come $n! = n \times (n-1)!$ (e naturalmente $0! = 1$, per avere un punto in cui termina la ricorsione). Qui invece dobbiamo applicare due volte la definizione della funzione.

Chiaramente se $ n \gt 100 $ non ci sono problemi a calcolare $M(n)$: basta togliere 10. Anche per $n = 100$ facciamo in fretta: $ M(100) = M(M(100+11)) = M(M(111)) = M(101) = 91$. Il bello arriva quando proviamo a calcolare il suo valore per i numeri minori di 100. Proviamo per esempio con $ n = 42$: preparatevi a un ottovolante.

M(42) = M(M(42+11)) = M(M(53))
      = M(M(M(64))) 
      = M(M(M(M(75))))
      = M(M(M(M(M(86)))))
      = M(M(M(M(M(M(97))))))
      = M(M(M(M(M(M(M(108)))))))
      = M(M(M(M(M(M(98))))))
      = M(M(M(M(M(M(M(109)))))))
      = M(M(M(M(M(M(99))))))
      = M(M(M(M(M(M(M(110)))))))
      = M(M(M(M(M(M(100))))))
      = M(M(M(M(M(91)))))) (l'abbiamo visto sopra...)
      = M(M(M(M(M(M(102))))))
      = M(M(M(M(M(92))))))
      = M(M(M(M(M(M(103))))))
      = M(M(M(M(M(93))))))
      = M(M(M(M(M(M(104))))))
      = M(M(M(M(M(94))))))
      = M(M(M(M(M(M(105))))))
      = M(M(M(M(M(95))))))
      = M(M(M(M(M(M(106))))))
      = M(M(M(M(M(96))))))
      = M(M(M(M(M(M(107))))))
      = M(M(M(M(M(97))))))
      = M(M(M(M(M(M(108))))))

Toh. Avevamo già trovato $M(M(M(M(M(M(M(108)))))))$ con un livello di parentesi in più. Saltando un po’ di passaggi continuiamo con

M(42) =
      ...
      = M(M(M(M(M(M(M(108))))))) 
      ...
      = M(M(M(M(M(M(108))))))
      ...
      = M(M(M(M(M(108)))))
      ...
      = M(M(M(M(108))))
      ...
      = M(M(M(108)))
      ...
      = M(M(108))
      ...
      = M(108)
      = M(M(98))
      = M(109)
      = M(M(99))
      = M(110)
      = M(M(100))
      = 91

È facile dimostrare per induzione (partendo dalla undicina $90 ≤ n \le 101$ e scendendo man mano di 11 in 11) che applicare $M$ a un qualunque numero intero minore di 100 porta a 91 (capito il perché del suo nome?). In pratica, la nostra funzione se ne sta piatta da meno infinito a 101, e poi diventa lineare. Strana, no?

Aggiungo solo che la funzione è usata come test per verificare i programmi automatici di verifica del software, proprio per la sua struttura così strana.

Ultimo aggiornamento: 2025-09-24 18:32

Rispondi

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.