Che cos'è un algoritmo
Il metodo per trovare il massimo comune divisore nel Libro VII degli Elementi di Euclide, scritto circa 2300 anni fa, funziona ancora oggi nei computer.
Un metodo che funziona sempre
Supponi di cercare il numero più grande che divide sia 1071 sia 462. Potresti provare tutti i numeri da 462 fino a 1 e fermarti al primo che li divide entrambi. Funziona, ma può richiedere centinaia di tentativi. C'è una strada più breve. Dividi 1071 per 462 e tieni il resto, 147. Ora dividi 462 per 147 e tieni il resto, 21. Dividi 147 per 21: il resto è 0, quindi la risposta è 21. Tre divisioni invece di diverse centinaia.
Quella strada più breve è un algoritmo: un elenco finito di passi precisi che prende un input e produce l'output giusto. Questo è l'algoritmo di Euclide per il massimo comune divisore, e compare nel Libro VII degli Elementi, scritti intorno al 300 a.C. Euclide lo descriveva con sottrazioni ripetute di lunghezze invece che con divisioni, ma l'idea è la stessa, e la versione con i resti è quella che usano oggi i programmi.
function gcd(a, b) {
while (b !== 0) {
const r = a % b; // resto
a = b;
b = r;
}
return a;
}
console.log(gcd(1071, 462)); // 21Che cosa rende un elenco di passi un algoritmo
Manuali come quello di Cormen, Leiserson, Rivest e Stein descrivono un algoritmo come una procedura ben definita che trasforma un input in un output. In questa descrizione ci sono tre elementi, e ognuno conta quando scrivi codice.
- Preciso. Ogni passo significa una cosa sola. «Dividi a per b e tieni il resto» è preciso; «rendi i numeri più piccoli in qualche modo» non lo è.
- Finito. Deve fermarsi. Nell'algoritmo di Euclide il resto è sempre più piccolo del numero per cui hai diviso, quindi diminuisce a ogni giro e deve arrivare a 0.
- Corretto. Per ogni input ammesso, l'output è la risposta giusta, non solo per gli esempi che hai provato.
Spesso si porta come esempio quotidiano una ricetta di cucina, ed è un esempio onesto: gli ingredienti sono l'input, il piatto è l'output e i passi sono in ordine. La differenza sta in quanto deve completare chi legge. Un cuoco decide che cosa vuol dire «un pizzico». Un computer non decide niente, ed è per questo che gli algoritmi per computer si scrivono con ogni passo spiegato per intero.
Stesso problema, algoritmi diversi
Di solito un problema ha molti algoritmi corretti, e possono differire moltissimo nella quantità di lavoro che fanno. Per il massimo comune divisore di 1071 e 462, provare tutti i numeri da 462 in giù richiede 442 tentativi prima di arrivare a 21, mentre il metodo di Euclide richiede 3 divisioni. Sono corretti entrambi. Solo uno è veloce. Buona parte di questo corso riguarda questa seconda domanda: una volta che un metodo è corretto, quanti passi richiede, e come cresce quel numero quando l'input diventa più grande?
Per rispondere, gli informatici contano i passi elementari (un confronto, uno scambio, una divisione) invece dei secondi. I secondi dipendono dalla macchina. Il numero di passi dipende solo dall'algoritmo e dall'input, quindi permette di confrontare due metodi in modo equo. Il laboratorio qui sotto conta per te i confronti mentre ordina una fila di barre. Prova lo stesso ordine iniziale con due metodi diversi e osserva i contatori.
Trascina per ruotare. Scorri o avvicina le dita per lo zoom.
Input, output e i passi in mezzo
Prima di scrivere un algoritmo, annota con esattezza che cosa entra e che cosa deve uscire. Per il massimo comune divisore: l'input sono due numeri interi positivi, e l'output è un numero intero che li divide entrambi, senza che un numero più grande faccia lo stesso. Questa descrizione ti dice come verificare il risultato, e spesso suggerisce i passi. Rivela anche i casi limite: e se uno dei numeri è 0? (Il ciclo qui sopra restituisce l'altro numero, che è la risposta corretta.) E se i due numeri sono uguali? Pensare ai casi limite prima di eseguire il codice evita molti errori.
- Circa 300 a.C.: Elementi di Euclide, Libro VII: il metodo del massimo comune divisore.
- 9° secolo: Al-Khwarizmi a Baghdad scrive sulle cifre indiane; il suo nome latino dà origine alla parola algoritmo.
- 1843: La nota G di Ada Lovelace: i passi con cui la macchina analitica calcola i numeri di Bernoulli.
- 1945: John von Neumann propone il merge sort.
- 1959: Tony Hoare inventa il quicksort a Mosca (pubblicato nel 1961).
| algoritmo | Un elenco finito di passi precisi che trasforma un input nell'output giusto |
| input | I dati da cui parte un algoritmo |
| output | Il risultato che l'algoritmo deve produrre |
| corretto | Dà l'output giusto per ogni input ammesso |
| finito | Si ferma sempre dopo un certo numero di passi |
| massimo comune divisore | Il più grande numero intero che divide esattamente due numeri |
| caso limite | Un input insolito come 0, una lista vuota o valori uguali |
| numero di passi | Quante operazioni elementari esegue un algoritmo |
- Con l'algoritmo di Euclide, qual è il massimo comune divisore di 48 e 18?
- Quante divisioni richiede l'algoritmo di Euclide per 1071 e 462?
- Quale di queste non è una proprietà che ogni algoritmo deve avere?
- Si ferma dopo un numero finito di passi
- Ogni passo è preciso
- Usa un computer
- Dà l'output giusto per ogni input ammesso
- Perché l'algoritmo di Euclide si ferma sempre?
- Il resto è sempre più piccolo del divisore, quindi scende fino a 0
- Si ferma dopo 10 giri
- I computer fermano i cicli automaticamente
- I numeri crescono finché non coincidono
- La parola algoritmo viene dal nome di
- Euclide
- Al-Khwarizmi
- Ada Lovelace
- Alan Turing
- Perché gli informatici contano i passi invece di misurare i secondi?
- I secondi dipendono dalla macchina; il numero di passi dipende solo dall'algoritmo e dall'input
- Gli orologi non sono precisi
- I passi sono sempre più veloci
- I secondi non si possono misurare nel codice
- Un metodo dà la risposta giusta per i cinque esempi che hai provato. È corretto?
- Sì, cinque esempi lo dimostrano
- Non necessariamente: deve essere giusto per ogni input ammesso
- Solo se è veloce
- Solo se usa un ciclo
- Che cosa restituisce gcd(35, 0) con il ciclo di questa unità?
- In che anno Ada Lovelace pubblicò le sue note, compresa la nota G?
- 1801
- 1843
- 1945
- 1961
- Metti in ordine i passi dell'algoritmo di Euclide.
- Un algoritmo è un elenco finito di passi precisi che va dall'input all'output corretto.
- L'algoritmo di Euclide trova il massimo comune divisore con resti ripetuti.
- Un problema può avere molti algoritmi corretti con numeri di passi molto diversi.
- Prima dei passi, scrivi l'input, l'output e i casi limite.
- La parola viene dal nome latino di al-Khwarizmi.
Fonti di questo corso (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Consultato il: 2026-10-17