Sequenza, selezione e iterazione
Siamo arrivati davvero all'ultimo argomento di questo intero corso di TIC, ed è anche il più importante dal punto di vista teorico: la scoperta che qualunque algoritmo, per quanto complesso possa sembrare, si può costruire combinando solo tre strutture di controllo fondamentali. È il cosiddetto teorema di Böhm-Jacopini, dimostrato nel 1966 da due informatici italiani, Corrado Böhm e Giuseppe Jacopini.
Le tre strutture sono:
- Sequenza: le istruzioni vengono eseguite una dopo l'altra, nell'ordine esatto in cui sono scritte. È la struttura più semplice, quella che abbiamo usato implicitamente in ogni singolo algoritmo visto finora, senza nemmeno doverla nominare
- Selezione: in base al valore di una condizione, si sceglie quale delle due (o più) strade seguire. È il rombo del diagramma di flusso e il blocco "se... altrimenti" di Scratch, che abbiamo già incontrato negli argomenti precedenti
- Iterazione: un gruppo di istruzioni viene ripetuto più volte, invece di essere riscritto identico ogni volta. È la struttura nuova di questo argomento conclusivo
Le tre strutture di controllo
Sequenza: istruzioni eseguite una dopo l'altra, in ordine. Selezione: si sceglie tra due (o più) strade in base a una condizione. Iterazione: un blocco di istruzioni viene ripetuto più volte, a contatore o a condizione.
L'iterazione (detta anche ciclo o loop) esiste in due forme principali. La prima è la ripetizione a contatore: si ripete un blocco di istruzioni un numero di volte stabilito in anticipo, ad esempio "ripeti 10 volte". La seconda è la ripetizione a condizione: si continua a ripetere finché (o fino a quando) una condizione resta vera, senza sapere in anticipo quante volte servirà, ad esempio "ripeti finché non indovini il numero". Attenzione: se la condizione di un ciclo a condizione non diventa mai falsa, si ottiene un ciclo infinito, un errore molto comune per chi inizia a programmare, che blocca completamente il programma senza che questo si accorga di nulla.
Vediamo subito come queste due forme di ciclo, per ora descritte solo a parole, diventano concrete, scritte esattamente come le vedresti davvero in un programma vero e proprio.
Le tre strutture nell'esempio pari/dispari da 1 a 20
In pseudocodice, l'esempio completo si scrive cosi': INIZIO — RIPETI 20 VOLTE (iterazione) — leggi il numero N (sequenza) — SE resto di N diviso 2 e' zero ALLORA scrivi "Pari" ALTRIMENTI scrivi "Dispari" (selezione, dentro l'iterazione) — FINE RIPETI — FINE. Nota come la selezione sia annidata dentro l'iterazione: e' cosi' che le tre strutture si combinano davvero nei programmi reali.
Vediamo ora, per concludere, come le tre strutture lavorano tutte e tre insieme in un unico esempio completo, che riprende e completa quello gia' visto nell'argomento su Scratch: un programma che, per ogni numero da 1 a 20, dice se è pari o dispari. La sequenza è l'ordine preciso dei passaggi del programma; l'iterazione ripete quei passaggi per ciascuno dei 20 numeri, uno alla volta (un ciclo "ripeti 20 volte"); la selezione, dentro al ciclo, decide ogni singola volta se dire "Pari" o "Dispari", a seconda del numero corrente. Da sole, sequenza, selezione e iterazione sono strumenti semplicissimi da capire, quasi banali: ma combinate insieme nel modo giusto, ripetute e annidate una dentro l'altra quanto serve, permettono di scrivere qualsiasi programma esistente, dal più piccolo script scolastico fino ai sistemi operativi e ai videogiochi più complessi del mondo.
Come si chiamano i cicli nei linguaggi di programmazione veri
Quando si passa a un linguaggio testuale come Python, i due tipi di iterazione hanno nomi precisi: il ciclo a contatore si chiama for (es. "for i in range(20):" ripete 20 volte), mentre il ciclo a condizione si chiama while (es. "while indovinato == falso:" continua finche' la condizione e' vera). Sono esattamente gli stessi due concetti visti con i blocchi di Scratch, solo scritti come testo invece che incastrati visivamente.

Un teorema dimostrato da due italiani
Il teorema di Böhm-Jacopini, che dimostra come sequenza, selezione e iterazione bastino da sole a costruire qualsiasi algoritmo, porta la firma di due informatici italiani, Corrado Böhm e Giuseppe Jacopini, che lo pubblicarono nel 1966. È uno dei risultati alla base della cosiddetta "programmazione strutturata", ancora oggi il modo standard di organizzare il codice nella maggior parte dei linguaggi di programmazione.
Questo teorema, che sembra solo un risultato teorico astratto, ebbe in realta' conseguenze pratiche importantissime nel modo in cui si scrive codice ancora oggi, decenni dopo la sua pubblicazione.
Una lettera che cambio' il modo di programmare
Nel 1968 l'informatico olandese Edsger Dijkstra scrisse una lettera, diventata poi famosissima, intitolata "Go To Statement Considered Harmful" ("l'istruzione goto e' considerata dannosa"). Dijkstra si baso' proprio sul teorema di Böhm-Jacopini per sostenere che, potendo scrivere qualsiasi programma con solo sequenza, selezione e iterazione, l'uso del "salto" incondizionato goto (diffusissimo all'epoca) rendeva il codice inutilmente confuso e difficile da correggere. Quella lettera e' considerata l'atto di nascita della "programmazione strutturata" moderna.
Interrompere un ciclo infinito e' piu' comune di quanto pensi
Ogni volta che un programma o un'app si "blocca" e non risponde piu', spesso il motivo e' proprio un ciclo infinito: una condizione che non diventa mai falsa, per cui il computer continua a ripetere le stesse istruzioni all'infinito. La combinazione di tasti Ctrl+Alt+Canc (o forzare la chiusura di un'app sullo smartphone) e' letteralmente un modo per interrompere dall'esterno un ciclo che non si fermerebbe mai da solo.
Il primo "ciclo" della storia, scritto un secolo prima dei computer
Torniamo, per chiudere il cerchio, al primissimo argomento di questo intero corso: Ada Lovelace, nelle sue note del 1843 sulla macchina analitica di Babbage, non si limito' a scrivere il primo algoritmo della storia. Nella sua "Nota G" descrisse anche come alcune operazioni dovessero essere ripetute ciclicamente per calcolare una particolare sequenza di numeri: e' considerata la primissima descrizione conosciuta di un'iterazione, scritta piu' di cent'anni prima che esistesse il primo computer elettronico funzionante.
►VideoSequenza, selezione, iterazione (Roberto Bellavita)
►VideoIstruzioni di iterazione WHILE, FOR e DO-WHILE in linguaggio C (Programmazione Time)
►VideoIl teorema di Jacopini-Bohm e le istruzioni sequenziali (29elode)Pari o dispari da 1 a 20
Riprendi lo script "pari o dispari" costruito nell'argomento precedente su Scratch. Racchiudilo in un blocco "ripeti 20 volte" e usa una variabile contatore che aumenta di 1 a ogni ripetizione, così che il programma dica automaticamente "Pari" o "Dispari" per ogni numero da 1 a 20, senza dover cliccare la bandiera verde venti volte. Identifica nel tuo script quale parte è la sequenza, quale la selezione e quale l'iterazione.
Con questo argomento si chiude davvero il percorso di Coding e pensiero computazionale, e con esso l'intero corso di TIC che abbiamo costruito insieme argomento dopo argomento: dalla scomposizione di un problema, al riconoscimento dei pattern, all'astrazione, al diagramma di flusso, ai blocchi di Scratch, fino a queste tre strutture finali che stanno alla base di ogni programma mai scritto, da quelli che usi ogni giorno sullo smartphone fino ai sistemi piu' complessi del mondo.
Mettiti alla prova
1. Quali sono le tre strutture di controllo fondamentali individuate dal teorema di Böhm-Jacopini?
Sequenza, selezione e iterazione.
2. Che cos'è la "sequenza"?
L'esecuzione delle istruzioni una dopo l'altra, nell'ordine in cui sono scritte.
3. Che cos'è la "selezione", e a quale simbolo del diagramma di flusso corrisponde?
La scelta tra due o più strade in base a una condizione; corrisponde al rombo.
4. Che cos'è l'"iterazione"?
La ripetizione di un gruppo di istruzioni più volte, invece di riscriverle ogni volta.
5. Qual è la differenza tra una ripetizione "a contatore" e una "a condizione"?
Quella a contatore ripete un numero di volte stabilito in anticipo (es. "ripeti 10 volte"); quella a condizione continua finché una condizione resta vera, senza sapere in anticipo quante volte.
6. Che cos'è un "ciclo infinito", e perché è un errore da evitare?
Un ciclo la cui condizione di uscita non diventa mai falsa, per cui il programma continua a ripetersi senza fermarsi mai, bloccandosi.
7. Chi ha dimostrato il teorema che porta il loro nome, e in che anno?
Corrado Böhm e Giuseppe Jacopini, nel 1966.
8. Nell'esempio pari/dispari da 1 a 20, la selezione e' annidata dentro l'iterazione o viceversa?
La selezione e' annidata dentro l'iterazione: ogni volta che il ciclo si ripete, al suo interno viene rifatta la scelta tra Pari e Dispari.
9. Come si chiamano, in un linguaggio come Python, il ciclo a contatore e il ciclo a condizione?
for (ciclo a contatore) e while (ciclo a condizione).
10. Che cosa sostenne Edsger Dijkstra nella sua famosa lettera del 1968, basandosi sul teorema di Böhm-Jacopini?
Che l'istruzione goto era dannosa e inutile, dato che qualsiasi programma si puo' scrivere con solo sequenza, selezione e iterazione.
11. Cosa descrisse Ada Lovelace nella sua "Nota G" del 1843, oltre al primo algoritmo della storia?
La prima descrizione conosciuta di un'iterazione: alcune operazioni ripetute ciclicamente per calcolare una sequenza di numeri.