Anteprima della struttura

Il pensiero computazionale: dall’intuizione alla precisione degli algoritmi

Dagli occhi al procedimento: 17 esempi sulle cifre, tre applicazioni svolte e un metodo per progettare, verificare e riutilizzare gli algoritmi.

Sezione: Pensiero computazionale Aggiornato:
Articoli /pensiero-computazionale-intuizione-algoritmi
Blocchi di legno sparsi diventano un percorso ordinato di tessere collegate, accanto a una lente e una matita
Dall’intuizione a una procedura: organizzare, collegare e verificare i passaggi.

18 min

Introduzione: il risultato non è ancora il procedimento

Quando parliamo di pensiero computazionale, spesso lo associamo alla programmazione. In realtà riguarda la capacità di affrontare un problema, analizzarlo e costruire una sequenza di istruzioni precise per risolverlo. Noi usiamo gli occhi, l’esperienza e conoscenze implicite; una procedura eseguibile deve invece esplicitare le operazioni da compiere.

Non esiste necessariamente un solo metodo: spesso possiamo scegliere fra rappresentazioni dei dati e algoritmi diversi. Qui cominciamo da operazioni sulle cifre che sembrano immediate, le trasformiamo in procedimenti aritmetici e poi applichiamo lo stesso modo di ragionare a problemi concreti. Non serve conoscere un linguaggio di programmazione.

Prima di cominciare: dati, DIV, MOD e assegnazioni

Salvo indicazione diversa, lavoriamo con interi non negativi scritti in base dieci. Un numero e il testo che lo rappresenta non sono la stessa cosa: come numero, 05 vale 5; come testo, «05» conserva due caratteri. Se ci interessano gli zeri iniziali dobbiamo dirlo prima di scegliere l’algoritmo.

DIV indica il quoziente intero e MOD il resto. La divisione 1234 per 100 produce quoziente 12 e resto 34: non sono due regole da memorizzare senza capire, ma due informazioni della stessa divisione.

1234 = 12 × 100 + 34
0 ≤ 34 < 100

Nei blocchi di istruzioni il segno = significa «assegna alla variabile il valore calcolato a destra». Perciò S = S + C aggiorna S: non è un’equazione da risolvere. Le righe si eseguono dall’alto verso il basso e l’indentazione mostra quali istruzioni vanno ripetute. Nelle condizioni, invece, = serve a confrontare due valori e non a modificarli.

Sono procedimenti aritmetici: non stiamo chiedendo alla macchina di riconoscere una fotografia delle cifre. Si potrebbero usare anche stringhe o altri metodi; l’importante è dichiarare i dati e le operazioni disponibili.

Parte prima — Sette esempi fondamentali

Nelle tabelle confrontiamo una soluzione intuitiva, spesso visiva, con una procedura esplicita eseguibile. Non sono capacità esclusive: anche una persona può eseguire l’algoritmo e uno stesso problema può avere più algoritmi validi.

1. Separare le ultime due cifre

Problema. Separare 1234 nella parte che precede le ultime due cifre e nelle ultime due cifre.

Soluzione umanaSoluzione macchina

Guardiamo la scrittura e immaginiamo un taglio prima delle ultime due cifre: 12 | 34.

Calcola il quoziente intero della divisione per 100 per ottenere A e il resto per ottenere B. Non occorre riconoscere visivamente le cifre.

A = 1234 DIV 100 = 12
B = 1234 MOD 100 = 34

In generale: A = N DIV 100; B = N MOD 100. Con 987654 otteniamo 9876 e 54. Con 1205 otteniamo 12 e 5: per mostrare 12 | 05, B va formattato su due cifre oppure gestito come testo. Se N è minore di 100, A vale 0.

2. Scambiare due variabili

Problema. Scambiare i valori A = 5 e B = 8, ottenendo A = 8 e B = 5.

Soluzione umanaSoluzione macchina

Immaginiamo due cartoncini con 5 e 8 e li scambiamo di posto. I due valori rimangono entrambi disponibili.

Le assegnazioni sono successive: A = B, da sola, cancellerebbe il vecchio A. Salva prima A nella variabile temporanea T, poi esegue lo scambio.

T = A
A = B
B = T

Dopo T = A abbiamo T = 5, A = 5, B = 8. Dopo A = B abbiamo T = 5, A = 8, B = 8. Infine B = T produce A = 8, B = 5. La variabile temporanea conserva l’informazione necessaria: un algoritmo deve seguire lo stato della memoria durante tutti i passaggi.

3. Trovare il maggiore fra tre numeri

Problema. Trovare il maggiore fra 17, 42 e 29.

Soluzione umanaSoluzione macchina

Confrontiamo mentalmente i tre valori e riconosciamo 42 come il maggiore.

Conserva in M il primo valore. Confronta gli altri uno alla volta con M e lo aggiorna solo quando trova un valore maggiore.

M = 17
Se 42 > M, allora M = 42
Se 29 > M, allora M = 29
Risultato: 42

Il primo confronto aggiorna M a 42; il secondo non lo cambia perché 29 non è maggiore di 42. Non serve prevedere separatamente ogni possibile ordine. Per una lista non vuota, inizializziamo M con il primo elemento e confrontiamo a turno tutti gli altri.

4. Contare le cifre

Problema. Determinare quante cifre ha il numero 72845.

Soluzione umanaSoluzione macchina

Leggiamo la scrittura e contiamo cinque posizioni: 7, 2, 8, 4, 5.

Divide ripetutamente N per 10 con divisione intera e conta le divisioni necessarie per arrivare a zero.

72845 → 7284 → 728 → 72 → 7 → 0
Numero di divisioni: 5

Le divisioni sono cinque. Occorre però prevedere che zero ha una cifra: un ciclo che parte solo quando N > 0, da solo, ne conterebbe zero. Per numeri negativi possiamo prima considerare il valore assoluto, senza contare il segno meno come cifra.

5. Invertire le cifre

Problema. Trasformare 1234 in 4321 senza trattare il numero come una stringa.

Soluzione umanaSoluzione macchina

Leggiamo le cifre da destra verso sinistra: 4, 3, 2, 1, ottenendo 4321.

Estrae l’ultima cifra C con MOD 10, la aggiunge al risultato R dopo averlo moltiplicato per 10 ed elimina la cifra da N con DIV 10. Ripete finché N è zero.

N = 1234; R = 0
Finché N > 0:
    C = N MOD 10
    R = R × 10 + C
    N = N DIV 10
PassaggioCifra estrattaRN dopo DIV 10
144123
234312
324321
4143210

I valori successivi di R sono 4, 43, 432, 4321. Ogni divisione intera accorcia N di una cifra: così sappiamo anche perché il ciclo termina. Gli zeri finali dell’originale non restano visibili nel numero invertito: 120 diventa 21, non una scrittura a tre cifre.

6. Riconoscere un palindromo

Problema. Verificare se 12321 è un palindromo.

Soluzione umanaSoluzione macchina

Leggiamo da sinistra e da destra e notiamo la stessa sequenza: 12321.

Conserva l’originale, calcola R con l’algoritmo di inversione e confronta i due valori. Sono uguali: il numero è palindromo.

Originale = 12321
R = 12321

12321 coincide con il suo inverso: è palindromo. 1234 e 4321 sono diversi: 1234 non lo è. Il numero 0 è palindromo. Qui si vede il riuso: un algoritmo già disponibile risolve un problema diverso. Conservare l’originale è indispensabile perché il ciclo di inversione consuma N.

7. I principi del pensiero computazionale

Gli esempi mettono in luce sei strumenti che lavorano insieme, non una sequenza rigida da applicare meccanicamente.

  • Scomposizione: dividere un problema in parti; per riconoscere un palindromo separiamo inversione e confronto.
  • Astrazione: conservare le caratteristiche rilevanti; per trovare il massimo contano i valori, non il colore con cui sono scritti.
  • Riconoscimento di schemi: notare che MOD 10 isola una cifra e DIV 10 permette di passare alla successiva.
  • Generalizzazione: trasformare il calcolo su 1234 in un metodo valido per N.
  • Progettazione algoritmica: precisare istruzioni, condizioni, ripetizioni e arresto.
  • Verifica: provare casi normali e casi limite, cercando anche situazioni che potrebbero smentire il metodo.

Il pensiero computazionale non è semplicemente «pensare come una macchina»: è formulare soluzioni che possano essere eseguite sistematicamente, spiegate, verificate e riutilizzate.

Parte seconda — Dieci problemi risolti con gli occhi e con la matematica

Nei dieci esempi seguenti usiamo soprattutto interi non negativi. L’obiettivo è ottenere con operazioni esplicite ciò che riconosciamo a colpo d’occhio.

8. Estrarre l’ultima cifra

Problema. Estrarre l’ultima cifra di 5837.

Soluzione umanaSoluzione macchina

Guardiamo la posizione più a destra e leggiamo 7.

Calcola il resto della divisione per 10: quel resto è l’ultima cifra.

5837 MOD 10 = 7

In generale, ultima = N MOD 10. Il resto è sempre una cifra fra 0 e 9. Anche con N = 0 il risultato è 0.

9. Eliminare l’ultima cifra

Problema. Eliminare l’ultima cifra di 5837.

Soluzione umanaSoluzione macchina

Copriamo idealmente il 7 finale e leggiamo 583.

Calcola il quoziente intero della divisione per 10, scartando il resto.

5837 DIV 10 = 583

Ripetendo l’operazione eliminiamo più cifre. Un numero con una sola cifra diventa 0.

10. Estrarre le ultime tre cifre

Problema. Estrarre le ultime tre cifre di 123456.

Soluzione umanaSoluzione macchina

Isoliamo visivamente le ultime tre posizioni: 456.

Calcola il resto della divisione per 1000. Il resto contiene il valore delle ultime tre cifre.

123456 MOD 1000 = 456

La stessa idea vale per le ultime k cifre usando MOD 10^k, con k intero positivo. Se chiediamo esattamente tre posizioni, un resto 7 va mostrato come 007: il valore numerico e la sua formattazione restano due problemi distinti.

11. Separare un numero in gruppi di tre cifre

Problema. Separare 1234567 in gruppi di tre cifre.

Soluzione umanaSoluzione macchina

Partiamo da destra e raggruppiamo le cifre: 1 | 234 | 567.

Estrae un gruppo con MOD 1000 e continua sul quoziente ottenuto con DIV 1000. Memorizza i gruppi e li mostra in ordine inverso all’estrazione.

1234567 MOD 1000 = 567
1234567 DIV 1000 = 1234
1234 MOD 1000 = 234
1234 DIV 1000 = 1

Otteniamo prima 567, poi 234, infine 1: per visualizzare il numero originale dobbiamo leggere i gruppi in ordine inverso a quello di estrazione. Ripetiamo finché il quoziente è zero; il numero 0 richiede un unico gruppo 0. Ogni gruppo dopo il primo, nella scrittura finale, va mostrato con tre cifre: 1002003 diventa 1 | 002 | 003.

12. Stabilire se un numero è pari

Problema. Stabilire se 2468 è pari.

Soluzione umanaSoluzione macchina

Riconosciamo 8 come cifra finale pari e concludiamo che il numero è pari.

Controlla se il resto della divisione del numero per 2 è zero.

2468 MOD 2 = 0

Se il resto è zero il numero è pari; altrimenti è dispari. Anche zero è pari, perché la sua divisione per 2 ha resto zero.

13. Sommare le cifre

Problema. Calcolare la somma delle cifre di 472.

Soluzione umanaSoluzione macchina

Leggiamo le cifre e sommiamo 4 + 7 + 2 = 13.

Parte da S = 0; estrae ogni ultima cifra con MOD 10, la aggiunge a S e prosegue con DIV 10.

N = 472; S = 0
Finché N > 0:
    S = S + (N MOD 10)
    N = N DIV 10
Risultato: S = 13

Le cifre arrivano nell’ordine 2, 7, 4; S diventa 2, poi 9, poi 13. L’ordine non cambia la somma. Con N = 0, S resta correttamente 0.

14. Trovare la cifra delle decine

Problema. Trovare la cifra delle decine di 5837.

Soluzione umanaSoluzione macchina

Individuiamo la seconda posizione da destra e leggiamo 3.

Elimina le unità con DIV 10 e isola l’ultima cifra rimasta con MOD 10.

(5837 DIV 10) MOD 10 = 3

Il primo passaggio produce 583 e il secondo 3. Se N ha una sola cifra, la cifra delle decine è 0.

15. Confrontare le prime cifre di due numeri

Problema. Verificare se 7824 e 7910 cominciano con la stessa cifra.

Soluzione umanaSoluzione macchina

Guardiamo la prima posizione di entrambi: leggiamo 7 e 7, quindi coincidono.

Divide ciascun numero per 10 con divisione intera finché rimane una sola cifra; poi confronta i due risultati.

7824 → 782 → 78 → 7; 7910 → 791 → 79 → 7. Le prime cifre coincidono. Il metodo funziona anche per numeri di lunghezza diversa: 7824 e 73 iniziano entrambi con 7. Se il dato è 0, la prima cifra è 0 e non servono divisioni.

16. Contare quante volte compare una cifra

Problema. Contare quante volte la cifra 7 compare in 727272.

Soluzione umanaSoluzione macchina

Scorriamo la scrittura e segniamo ogni 7: ne troviamo tre.

Estrae una cifra alla volta con MOD 10, incrementa CONT soltanto se la cifra è 7 e prosegue con DIV 10.

N = 727272; CONT = 0
Finché N > 0:
    Se N MOD 10 = 7, allora CONT = CONT + 1
    N = N DIV 10
Risultato: CONT = 3

Per contare una cifra scelta sostituiamo 7 con un parametro C fra 0 e 9. Attenzione al numero 0: la cifra 0 vi compare una volta, non zero. Lo gestiamo separatamente prima del ciclo; con qualunque altra cifra il conteggio in 0 è nullo.

17. Verificare se tutte le cifre sono uguali

Problema. Verificare se tutte le cifre sono uguali in 5555 e in 5553.

Soluzione umanaSoluzione macchina

Riconosciamo quattro 5 nel primo numero; nel secondo notiamo il 3 diverso dagli altri.

Memorizza la prima cifra estratta con MOD 10 e confronta con essa tutte le successive. Si ferma appena incontra una differenza.

Per 5555 la cifra di riferimento è 5 e tutti i confronti confermano l’uguaglianza. Per 5553 il riferimento è 3 e il successivo 5 la smentisce: non occorre continuare. Il procedimento non richiede di conoscere in anticipo il numero di cifre. Un numero di una sola cifra, compreso 0, soddisfa la proprietà.

Parte terza — Tre applicazioni significative

Le stesse idee non servono soltanto a manipolare cifre. Proviamo a trasferirle a orari, ricerche e controllo degli errori: ogni volta specifichiamo dati, procedimento e verifica.

18. Orari: quando una divisione descrive una situazione reale

Problema. Una lezione comincia alle 09:50 e dura 95 minuti. A che ora finisce?

Soluzione umanaSoluzione macchina

Scomponiamo 95 minuti in 60 + 35: un’ora dopo sono le 10:50; altri 35 minuti portano alle 11:25.

Converte l’inizio in minuti dall’inizio del giorno, aggiunge la durata e riconverte con DIV 60 e MOD 60. Ammette ore fra 0 e 23, minuti fra 0 e 59 e una durata intera non negativa.

9 × 60 + 50 = 590
590 + 95 = 685
685 DIV 60 = 11
685 MOD 60 = 25

La lezione finisce alle 11:25. DIV 60 conta le ore complete e MOD 60 i minuti rimasti: è la stessa idea vista sulle cifre, ma con gruppi di 60.

Caso limite: 23:50 più 30 minuti produce 1460 minuti. Il quoziente della divisione per 1440 indica quanti giorni sono passati; il resto indica i minuti del nuovo giorno. Otteniamo il giorno successivo alle 00:20. Dichiarare il cambio di giorno fa parte della soluzione, non è un dettaglio grafico.

23 × 60 + 50 + 30 = 1460
1460 DIV 1440 = 1
1460 MOD 1440 = 20
20 DIV 60 = 0
20 MOD 60 = 20

19. Cercare un numero: perché la rappresentazione cambia il metodo

Problema. Cercare 42 nella lista ordinata [3, 8, 12, 17, 23, 31, 42, 58].

Soluzione umanaSoluzione macchina

Scorriamo la lista da sinistra e riconosciamo 42 nella settima posizione: con questa strategia esaminiamo sette elementi.

Sfrutta l’ordine con una ricerca binaria: numera le posizioni da 1, sceglie quella centrale arrotondata per difetto e scarta la metà incompatibile con il confronto. Visita le posizioni 4, 6 e 7.

ConfrontoIntervallo successivo
Posizione 4: 17 < 42Posizioni 5–8
Posizione 6: 31 < 42Posizioni 7–8
Posizione 7: 42 = 42Trovato: posizione 7

Sono bastati tre confronti. Se cercassimo 40, dopo il confronto con 42 resterebbe un intervallo vuoto: potremmo dichiarare il numero assente. La condizione di arresto comprende quindi sia «trovato» sia «nessuna posizione rimasta».

Questa ricerca funziona perché la lista è ordinata e possiamo accedere alle posizioni centrali. Su una lista disordinata, scartare metà dei valori sarebbe ingiustificato. Ordinare ha un costo: per una sola ricerca può non convenire; per molte ricerche gli stessi dati ordinati possono essere riutilizzati. Un buon algoritmo dipende anche dalle ipotesi e dal contesto.

20. Trovare un errore: il massimo di numeri negativi

Problema. Perché iniziare il massimo da M = 0 funziona su [17, 42, 29] ma fallisce su [−8, −3, −12]? Come correggere il procedimento?

Soluzione umanaSoluzione macchina

Riconosciamo −3 come il maggiore dei tre numeri negativi. Notiamo subito che 0 non appartiene alla lista e non può esserne il massimo.

Con M = 0 nessun numero negativo aggiorna il massimo: il risultato resta erroneamente 0. Per una lista non vuota inizializza invece M con il primo elemento, poi confronta gli altri.

M = −8
Se −3 > M, allora M = −3
Se −12 > M, allora M = −12
Risultato: −3

Il risultato corretto è −3. Il test con numeri positivi non bastava a dimostrare la validità del procedimento. Proviamo anche una lista con un solo elemento, valori tutti uguali e una lista vuota: in quest’ultimo caso il massimo non è definito e bisogna segnalare l’assenza di dati, non inventare uno zero.

Questa è una buona abitudine anche con l’IA: non chiedere solo una soluzione, ma anche le sue ipotesi, un controesempio e casi di prova. Una risposta convincente deve ancora superare verifiche indipendenti.

Perché parlarne in «IA e pensiero»

Saper formulare un procedimento aiuta anche a usare l’intelligenza artificiale senza confondere una risposta plausibile con una risposta verificata. Possiamo farci proporre una strategia, ma dobbiamo sapere quali dati utilizza, quali ipotesi richiede e come controllarne il risultato.

Una richiesta utile è: «Devo contare le cifre di un intero, compreso zero. Mostra i passaggi su 72845, spiega la condizione di arresto e prova anche 0 e −10, contando solo le cifre e non il segno». La richiesta precisa input, risultato desiderato, metodo di spiegazione e casi limite. Non garantisce da sola la correttezza: ci mette però nelle condizioni di verificarla.

Una piccola lista di controllo

  1. Quali sono i dati in ingresso e quali valori sono ammessi?
  2. Quale risultato voglio ottenere, in quale rappresentazione?
  3. Quali operazioni posso usare e quali informazioni devo conservare?
  4. Quali istruzioni si ripetono e perché la ripetizione termina?
  5. Che cosa succede con zero, dati minimi, dati assenti o valori inattesi?
  6. Posso eseguire il procedimento a mano e controllarlo con un altro metodo?

Conclusione — Dal risultato al procedimento

Molte operazioni sono immediate per noi perché vediamo la rappresentazione scritta di un numero. Quando cerchiamo una procedura dobbiamo esplicitare quali dati usare, quali operazioni compiere, quando ripeterle e quando fermarci.

L’obiettivo educativo non è rinunciare all’intuizione, ma trasformarla in un metodo: «Come hai trovato il risultato? Il procedimento funziona sempre? Puoi spiegarlo a chi non può affidarsi ai tuoi occhi?». Queste domande collegano matematica, logica e informatica e possono essere affrontate molto prima di imparare un linguaggio di programmazione.

Tutti gli articoli di Pensiero computazionale