Gli Algoritmi - Valerio Curcio

annuncio pubblicitario
dr Valerio Curcio - Gli Algoritmi
1

Gli Algoritmi
dr Valerio Curcio - Gli Algoritmi
2

Indice
1. Introduzione………………………………………………………………………… 3
2. Un po’ di storia……………………………………………………………………… 5
3. Ma cosa sarà mai un algoritmo……………………………………………………. 8
4. Alcuni esempi di algoritmi…………………………………………………………. 15
5. Conclusioni………………………………………………………………………….. 21
dr Valerio Curcio - Gli Algoritmi
3

1. Introduzione
Le norme transitorie sull’autonomia invitano a studiare percorsi didattici fondati su obiettivi
formativi e competenze. Le fonti per questo lavoro di approfondimento non mancano e vanno dai
documenti via via elaborati dalle Commissioni dei Saggi nel 1997 e 1998 alla più recente
produzione delle associazioni disciplinari e della stessa amministrazione scolastica, ora raccolta in
un Dossier monografico degli Studi e documenti degli Annali della P.I. (1999). Emerge dallo studio
di questo dossier un profilo del concetto di competenza, da intendersi come padroneggiamento
teorico e pratico delle conoscenze.
Bisogna quindi individuare le discipline che concorrono alla definizione di competenza, i nuclei
fondanti, gli argomenti irrinunciabili e le possibili interconnessioni tra i diversi campi del sapere.
Per l’individuazione dei nuclei fondanti di una disciplina occorrerà tenere presente, da una parte, lo
statuto epistemologico (oggetto, linguaggio, metodologia di ricerca) e dall’altra la finalità formativa
che a essa viene attribuita.
Ma cosa si intende per nucleo fondante di una disciplina? Vengono date alcune definizioni
provenienti da diversi rapporti della commissione dei “Saggi” citata già in precedenza.
Per nuclei fondanti si intendono quei concetti fondamentali che ricorrono in vari punti dello
sviluppo di una disciplina e hanno perciò valore strutturante e generativo di conoscenze.
I nuclei fondanti sono concetti, nodi epistemologici e metodologici che strutturano una
disciplina.
(…) Un sistema di istruzione, in grado di corrispondere all’evoluzione qualitativa e
quantitativa dei saperi, comporta […] che le conoscenze siano selezionate e strutturate in
termini di essenzialità. Ma una intelaiatura delle conoscenze compatta e coesa, postula, a sua
volta, la organizzazione dei contenuti dell’insegnamento intorno a nodi essenziali che si
configurino come dei veri e propri nuclei fondanti.
(…) I nuclei fondanti possono […] definirsi tali quando assumono un esplicito valore
formativo rispetto alle competenze di cui sono i supporti e gli apparati serventi.
(…) Nel processo di insegnamento/apprendimento il nucleo fondante configura […] quanto
delle conoscenze è indispensabile utilizzare e padroneggiare in una prospettiva dinamica e
generativa.
Dopo aver brevemente fatto cenno a quelle che sembrano essere le esigenze formative della scuola
del futuro, desideriamo addentrarci in questo lavoro nel quale svilupperemo, vista l’affermarsi
prepotente dell’informatica nelle scuole, il concetto di algoritmo come uno dei suoi nuclei fondanti.
Lo scopo di questo lavoro non vuole essere esclusivamente quello di presentare il concetto di
algoritmo come risultato di una ricerca, ma vogliamo cercare di dare risposte a domande che spesso i
dr Valerio Curcio - Gli Algoritmi
4

nostri alunni ci formulano. Desideriamo dare un valore didattico a tutto ciò che verrà fatto, affinché
questo non sia un lavoro sterile, da aggiungere ai milioni già in circolazione e che trattano questo
argomento, ma abbia una sua originalità e utilità, così da poterlo considerare come punto di partenza
o vera e propria guida per quella che sarà l’attività futura di insegnamento; certo non sarà facile, ma
ci proveremo!
Abbiamo scelto di chiudere questa fase introduttiva con una e-mail inviata da Rebecca, una giovane
studentessa di un istituto superiore di Los Angeles, ad un professore di informatica (non il suo,
ovviamente!). La lettera è evidentemente in lingua inglese, ma viene qui presentata la sua traduzione
in italiano.
Ma cos’è un algoritmo?
Mi piacerebbe che mi dicesse cosa significa...e perché esso si trova nell’indice del
nostro libro?
In classe il mio prof mi ha dato alcuni esempi di algoritmi:
•
"Per trasformare un decimale in un percentuale, muovi il punto decimale due posti
verso destra e aggiungi il simbolo %."
•
"Per dividere due frazioni, prima inverti il divisore, poi moltiplica."
Io penso che stiamo spendendo tanto tempo prezioso in classe per insegnare ed
imparare gli algoritmi e dimentichiamo che essi sono fuori dal mondo reale…mi
chiedo, ma quando mai dividerò due frazioni nella mia vita? Non ho mai incontrato
una frazione per la strada!
Così, un algoritmo è…Bene, aspetti un minuto…perché non mi dice cosa pensa esso
sia, dopo aver letto gli esempi sopra citati?
Mi invii un messaggio: In venticinque parole o anche meno, mi dica cos’è un
algoritmo e se esso è o no importante per la nostra vita. O, se lei è un vero
insegnante, mi dica se ritiene o meno importante continuare a spendere ancora
tempo prezioso in classe per gli algoritmi…
Aspetto una sua risposta più velocemente possibile. Grazie
Rebecca
Crediamo che questa sia una delle domande, forse quella classica, che ogni alunno ci formula se ci
dovessimo addentrare nella spiegazione degli algoritmi. Stimolati da una tale e legittima domanda
partiremo col nostro lavoro per arrivare, se possibile, a rispondere alla nostra amica Rebecca, come
rappresentante dei nostri futuri alunni.
dr Valerio Curcio - Gli Algoritmi
5

2. Un po’ di storia…
Domande del tipo ma cos’è un algoritmo? oppure perché si chiama algoritmo?, ma anche perché
questo è un algoritmo e quest’altro no? sono spesso in agguato durante una lezione di informatica in
cui viene presentato questo argomento. Spesso questa parola viene “scaraventata” addosso agli
alunni in modo nascosto, senza cioè dare una definizione che sia più intuitiva possibile,
considerando l’età degli studenti ed il tipo di scuola in cui si insegna.
Uno studente in giovane età è sempre portato a farsi e fare domande, sicuramente perché spinto da
una curiosità innata, ma anche perché si trova, probabilmente per la prima volta, di fronte a
qualcuno (l’insegnante) che finalmente può spiegargli in modo chiaro e semplice il significato di
una parola quale algoritmo che chissà quante volte avrà già sentito nella sua vita, ma senza mai
capirne il reale senso e senza quindi prestargli la debita attenzione.
Ma allora perché non partire dall’inizio, dalla storia di questa parola, dalle diverse interpretazioni, se
esiste o no una sua etimologia. Crediamo sia didatticamente corretto ed efficace impostare un
discorso del genere, pur tenendo conto dei limiti imposti dal tempo scolastico che è sempre troppo
poco.
Noi ci divertiremo ad indagare le radici storiche dell’algoritmo in uno studio out of time perché
questo è un lavoro di base e non una lezione fatta a scuola. Un materiale del genere potrebbe essere
apprezzato dallo studente che vuole approfondire, per meglio capire ciò con cui ha a che fare.
Cosa c’è di più bello nella vita di una storiella, quella che ci raccontava la nonna per farci stare
buoni. Allora perché la scuola non deve essere come la nostra nonna? Questa è una domanda che mi
pongo io (anche gli insegnanti se le pongono…siamo pur sempre alunni ed è vero che non si finisce
mai di imparare).
Bene, allora facciamo un po’ di storia dell’algoritmo e vediamo così se qualche idea primordiale di
ciò che può essere ce la possiamo fare.
La prima cosa da fare quando non si conosce il significato di una parola è usare il vocabolario o
l’enciclopedia; ma facendo così ci accorgiamo di entrare in una ipotetica macchina del tempo che ci
catapulta lontano nel passato.
Scendendo da questa macchina, insieme a Rebecca, ci accorgiamo che ci troviamo nel IX secolo
d.C. in una stupenda città che giace tra le sponde di due grandi fiumi: il Tigri e l’Eufrate. Capiamo
che ci troviamo nella grande città di Baghdad, capitale della grande Babilonia e cuore pulsante delle
scienze di quel tempo.
dr Valerio Curcio - Gli Algoritmi
6

Ogni informazione, ogni indizio ci porta ad un grande astronomo e matematico del tempo Abu
Ja'far Mohammed ibn Mâsâ al-Khowârizmî, che chiameremo semplicemente al-Khowârizmî,
vissuto tra l’780 e l’840 d.C.
Nel periodo tra l’809 e l’833 fu fondata a Baghdad una “casa del sapere” di cui faceva parte anche il
nostro ormai famoso al-Khowârizmî.
Al-Khowarizmi scrisse dozzine di libri, ma quello che più ci interessa da vicino (perché non
possiamo perdere di vista i nostri scopi) tratta la numerazione Indo-Arabica. Il fatto curioso è che
questo testo ci fornisce una prima versione etimologica della parola algoritmo nel senso che adesso
descriveremo.
Il titolo del testo in arabo di cui facevamo riferimento appena sopra è andato irrimediabilmente
perso, ma di quest’opera esistono due traduzioni, una in latino e l’altra in inglese. La traduzione
latina ha come titolo Algoritmi de numero Indorum, la cui traduzione sarebbe Gli algoritmi degli
indù riguardo ai numeri. La cosa curiosa è che in realtà tale titolo può essere tradotto in un altro
senso, cioè Dei numeri Indù di Algoritmo. Quest’ultima traduzione, che a prima vista sembrerebbe
poco credibile, troverebbe invece conferma nel titolo della stessa opera tradotta in inglese, cioè
Al-Khwarizmi on the Hindu Art of Reckoning. Da ciò si evince che la parola algoritmo altro non è
che lo “storpiamento” del nome dell’astronomo e matematico arabo durante le varie trascrizioni e
traduzioni (infatti più di qualche studioso fa risalire la parola algoritmi al termine spagnolo
alguarismi, che altro non sarebbe se non la trascrizione della pronuncia del nome del matematico
arabo. Ed infatti è ben noto che molti scritti arabi passarono dalla Spagna prima di arrivare fino a
noi). C’è comunque da considerare che molti studiosi giudicano la versione latina dell’opera di alKhwarizmi cambiata di molto rispetto a quella originale (della quale non abbiamo più traccia del
titolo).
Per completezza di informazione diciamo che in questa opera, per la prima volta, viene presentato il
sistema di numerazione decimale basato sui numeri 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. Da notare come
al-Khwarizmi fu il primo ad utilizzare lo zero in ultima posizione, cioè dopo il numero 9. Altro fatto
notevole è che la numerazione decimale che oggi conosciamo non fu invenzione degli arabi, ma essi
stessi la importarono dall’India, come giustamente citato nell’opera dell’ormai famoso matematico
arabo.
Esiste anche un’altra versione etimologica della parola algoritmo. Secondo tale versione gli arabi
avrebbero preso “in prestito” dai greci la parola arithmos che significa numero (dal verbo arithmeo
numerare) preponendo ad esso l’articolo arabo al. Detto così l’algoritmo avrebbe come etimologia
proprio il numero. Ma il verbo arithmeo fa anche riferimento alla funzione di spostare oggetti da
una parte all’altra, cioè quello che viene fatto in una operazione aritmetica (definita proprio come
dr Valerio Curcio - Gli Algoritmi
7

arte dello spostare oggetti da una parte all’altra) o algebrica quando si “spostano” i termini da un
membro all’altro. Chissà se la nostra amichetta Rebecca a questo punto troverà più interessanti gli
algoritmi, se non altro dal punto di vista storico. E chissà se queste informazioni di tipo storicoetimologiche possono contribuire ad una prima idea, rigorosamente intuitiva, di ciò che potrebbe
essere un algoritmo.
dr Valerio Curcio - Gli Algoritmi
8

3. Problema: ma cosa sarà mai un algoritmo?
Ci poniamo le seguenti domande:
Esiste una definizione univoca ed universale di algoritmo?
Esistono più tipi di algoritmi (nel senso se sono applicabili a diversi contesti)?
Perché a volte si considera algoritmo ciò che in realtà non lo è?
Perché quando si sente parlare di algoritmo subito si pensa ad un computer?
Bene, in questo paragrafo cercheremo di rispondere a queste domande.
Esistono diverse ed innumerevoli definizioni di algoritmo, ognuna delle quali fa riferimento a
svariati campi. Il nostro lavoro sarà quello di presentarne di diverse e di cercare di estrapolare da
esse le informazioni comuni, cioè tutto quello che sicuramente sarà utile nel tentativo di dare la
definizione finale che meglio, a nostro parere, può essere presentata alla nostra Rebecca, affinché
essa (la definizione) possa risultare la più “appetibile” possibile!
Seguono adesso diverse definizioni che man mano analizzeremo.
1. Un algoritmo è una sequenza ordinata di passi semplici che hanno lo scopo di portare a
termine un compito più complesso (una ricetta da cucina, ad esempio, può essere considerata
come un algoritmo che partendo da un insieme di singoli alimenti di base ed eseguendo una
sequenza di passi, produce come risultato un piatto composto). In un modo più formale,
possiamo quindi definire l'algoritmo come una sequenza ordinata e finita di istruzioni che,
dato uno o una serie di elementi in input, produce uno od una serie di risultati in output.
La cosa che risalta da questa definizione è che viene usata una metafora di vita reale quotidiana, la
ricetta da cucina. Riteniamo però poco intuibile il concetto di sequenza ordinata, specialmente se
riferita alla metafora usata. Se devo cucinare una carbonara posso benissimo prima sbattere le uova
e poi buttar giù la pasta, ma posso benissimo sbattere le uova dopo aver buttato la pasta nella
pentola. In entrambi i casi si arriverà alla soluzione, cioè alla carbonara, ma chi stabilisce qual è la
giusta sequenza? Riteniamo quindi inopportuno l’utilizzo della metafora della ricetta da cucina per
spiegare un algoritmo. E poi come possiamo parlare a Rebecca di elementi in input e serie di
risultati in output? Riteniamo questa definizione allo stesso tempo troppo tecnica e poco intuibile.
2. Procedimento di calcolo, metodo per risolvere un problema, descritto mediante un elenco
finito di istruzioni eseguibili "meccanicamente" e in un ordine prestabilito o stabilito
meccanicamente, senza libere scelte da parte dell'esecutore.
A noi piace molto la frase metodo per risolvere un problema e abbiamo deciso di “salvarla” perché
forse per la prima volta abbiamo un riferimento chiaro e concreto riguardo l’utilità dell’algoritmo.
Per il resto non ci risulta intuitivo pensare ad istruzioni eseguibili meccanicamente, o meglio, cosa si
intende per ordine stabilito meccanicamente. Riteniamo altresì in agguato domande del tipo: ma
dr Valerio Curcio - Gli Algoritmi
9

cos’è un esecutore? Cosa si intende per libere scelte? Non crediamo possibile e didatticamente
corretto definire un algoritmo in questo modo (povera Rebecca!!!).
3. Un programma per computer può essere visto come un elaborato algoritmo. Nelle scienze
matematiche e informatiche un algoritmo generalmente indica una piccola procedura che
risolve un problema ricorrente, o uno schema uniforme per risolvere una classe di problemi.
Questa definizione,a differenza delle precedenti, fa esplicito riferimento all’utilizzo del computer,
riducendo il concetto di algoritmo a quello di un programma eseguibile da un calcolatore. Ci
chiediamo se con una piccola procedura faccia riferimento al fatto che debba essere finita o
piuttosto alla lunghezza della stessa, nel senso che una procedura lunga potrebbe non essere un
algoritmo. Questa definizione ci sembra parecchio ambigua anche se in essa c’è qualcosa da salvare.
Infatti per la prima volta si parla di classi di problemi. Abbiamo dunque un’informazione in più,
cioè quella che un algoritmo, oltre ad essere uno strumento che risolve un certo problema, riesce a
risolvere una classe intera di problemi ad esso simili. Ma cosa s’intende per schema uniforme?
Anche in questo caso c’è tanta ambiguità e pertanto anche questa definizione non ci risulta adeguata
per i nostri scopi, cioè convincere Rebecca dell’importanza degli algoritmi.
4. L'algoritmo è l'insieme delle operazioni, logiche di calcolo, la cui sequenza porta con
certezza ad un determinato risultato.
Questa definizione ci sembra evidentemente banale e poco rigorosa. Infatti manca un chiaro
riferimento alla cardinalità di questo insieme di operazioni; siamo sicuri che un insieme infinito di
operazioni o una operazione da ripetere all’infinito porti ad un risultato con assoluta certezza?
Possiamo dire che un comando del tipo “gira su te stesso” senza specificare per quante volte sia un
algoritmo? La cosa che però salviamo da questa definizione è che un algoritmo ci porta con certezza
ad un determinato risultato.
5. Sequenza finita di mosse per risolvere, in tempo finito, un problema.
Questa piccola definizione ci offre importanti spunti di riflessione. Intanto che per la prima volta si
fa riferimento ad un contesto generico in cui le istruzioni vengono espresse in termini di mosse.
Ancora una volta si fa riferimento chiaro al fatto che la sequenza deve essere finita, ma ancor di più
si parla di tempo di esecuzione. Infatti una sequenza, pur essendo finita, potrebbe protrarsi
all’infinito dal punto di vista temporale. Tornando all’esempio precedente, dando l’istruzione “gira
su te stesso”, pur essendo un singolo comando, se non viene specificato per quanto tempo o per
quante volte, si potrebbe andare avanti nell’esecuzione del comando all’infinito. Questa definizione
ci sembra efficace, soprattutto perché ci viene presentato l’algoritmo come un qualcosa non
esclusivamente legato ai computer o ai problemi di matematica, ma anche come metodo risolutivo
di giochi (pensiamo agli scacchi, alla dama, ai giochi di strategia come risiko, per esempio) e ciò
dr Valerio Curcio - Gli Algoritmi
10

potrebbe essere stimolante dal punto di vista didattico. Questa definizione, inoltre, se inquadrata in
un’ottica più ampia ci offre una visione alternativa di informatica non più vista come qualcosa da
sviluppare al computer, ma come vera e propria arte della risoluzione dei problemi.
6. Insieme di procedure ben definite che conducono alla soluzione di un problema in un
numero finito di operazioni.
Qui non ci risulta ben chiaro cosa s’intende per procedura ben definita per cui il senso ci risulta
ambiguo. Anche qui viene dato risalto all’algoritmo come risolutore di un problema ed al fatto che il
numero delle operazioni deve essere limitato. Non riteniamo comunque che questa sia una
definizione proponibile.
7. Insieme di istruzioni elementari (univocamente interpretabili) che, eseguite in un ordine
stabilito, permettono la soluzione di un problema in un numero finito di passi.
Per la prima volta si parla di univocità delle istruzioni e riteniamo, quindi, che questo sia un altro di
quei concetti da salvare per poi dare una definizione finale di algoritmo. C’è però da dire che non è
ben chiaro cosa sia un’istruzione elementare, ragion per cui, pur essendo abbastanza intuibile,
questa definizione ci sembra piuttosto “pesante” e forse non rende bene l’idea di algoritmo.
Crediamo che la nostra Rebecca non debba “scappare” di fronte alla definizione di algoritmo;
stiamo facendo tutto questo lavoro per lei, per rispondere alle sue domande, per cui non possiamo
confonderla più di quanto già lo è!
8. Procedimento matematico per la creazione di sequenze di bit.
In realtà potremmo dire a Rebecca che neanche noi siamo in grado di capire una tale definizione di
algoritmo. Essa appare troppo specifica, quindi poco generalizzabile e la cosa non avrebbe
sicuramente buoni effetti dal punto di vista didattico. E’ importante far prendere coscienza del fatto
che gli algoritmi che si studiano in matematica non sono definibili in modo diverso da quelli
esclusivamente informatici. Con una definizione del genere sembrerebbe che l’algoritmo sia “cosa”
da riferire esclusivamente al computer.
9. Un algoritmo è una procedura di calcolo o, più in generale, l'elenco delle operazioni
necessarie per risolvere un problema in un numero finito di operazioni.
Così come nella definizione precedente viene dato risalto al procedimento matematico che qui è
inteso come procedura di calcolo. Non è detto che un elenco di operazioni necessarie per risolvere
un problema sia anche sufficiente per raggiungere lo scopo. Per questa ragione non ci sembra
opportuno dare una definizione di questo tipo, ma anche perché sembra che per ogni problema ci sia
un algoritmo fatto su misura per la sua soluzione, mentre potrebbero esserci problemi simili (ma
opportunamente “velati”) che richiedono lo stesso algoritmo per la loro soluzione.
dr Valerio Curcio - Gli Algoritmi
11

10. L’algoritmo è una serie dettagliata di istruzioni da potere essere utilizzata senza doverci
pensare troppo. Differisce da macro in quanto quest'ultima è ripetibile, mentre l'algoritmo è
usato una o poche volte
Riteniamo che questa definizione sia poco intuibile e pochissimo rigorosa. Essa non tiene conto del
numero finito delle istruzioni ed è talmente tanto decontestualizzata che, in base a tale definizione,
non riusciamo a capire in che ambito può essere usato un algoritmo. Cosa significa il non dover
troppo pensare all’utilizzo della serie di istruzioni? Si fa riferimento al tempo di esecuzione che
deve essere limitato o all’ingenuità con cui vengono eseguite le operazioni elementari? Resta troppa
ambiguità per cui riteniamo di poter scartare questa definizione.
11. Insieme di regole che consentono di risolvere un dato problema in tempo finito. E'
importante distinguere un algoritmo da un programma: mentre un algoritmo è il
procedimento da seguire per risolvere un problema a prescindere dal linguaggio utilizzato,
un programma consiste nella descrizione di un algoritmo in uno specifico linguaggio di
programmazione.
Finalmente torna un chiaro riferimento al tempo di esecuzione che deve essere finito. E’ abbastanza
intuitivo pensare che per giungere alla risoluzione di un problema, se esso è risolvibile, il tempo di
elaborazione deve essere finito (seppur lungo quanto si voglia). Resta però l’ambiguità riferita
all’insieme di regole; infatti non viene fatto alcun cenno alla necessità di univocità delle stesse.
Questa comunque ci sembra una buona definizione, anche se non completa. Riteniamo altresì
significativa la distinzione proposta tra programma e algoritmo. Infatti spesso siamo portati a
confondere i due concetti, soprattutto se consideriamo gli algoritmi coma qualcosa da legare
indissolubilmente al computer e alla programmazione; così non dovrebbe essere ed infatti questo è
uno degli scopi di questo lavoro, cioè presentare il concetto di algoritmo decontestualizzandolo il
più possibile in modo che tutto ciò possa giovare anche alla corretta pratica dell’informatica a
scuola.
12. E' un insieme di operazioni che permettono di raggiungere un certo scopo e/o di risolvere un
problema.
Anche in questa definizione c’è il tentativo di decontestualizzare il concetto di algoritmo
considerandolo anche come metodo che permette di raggiungere uno scopo. Ispirandoci a tale
definizione possiamo citare un curioso tentativo di applicazione di algoritmi in ambiti estranei alle
scienze, basti pensare al campo giuridico.
In un convegno dedicato all’utilizzo dell’informatica nelle pratiche giuridiche si è posto l’accento su
come essa può portare il legislatore a formulare la legge in modo diverso da quello usuale,
utilizzando il linguaggio algebrico di Bull, ossia gli operatori logici buleani. Quando il legislatore
dr Valerio Curcio - Gli Algoritmi
12

utilizzerà questo linguaggio si potranno conseguire vantaggi di rilievo: unicità di interpretazione e la
possibilità di prevedere subito tutte le probabili interpretazioni successive (ossia pratiche) della
norma. Questo linguaggio costituirà una nuova sintassi che dovrà essere imparata. Sarà più semplice
effettuare ricerche di documentazione giuridica grazie all’ausilio di parole chiave.
Oggi l’enunciato della legge non è univoco, infatti non è un algoritmo!
Uno dei relatori del convegno afferma: L’algoritmo è quell’insieme di regole generali, astratte,
formulate ex ante, precise e univoche, applicate le quali si giunge al risultato esatto: giusta
interpretazione della legge.
Da questo piccolo, ma significativo esempio evinciamo che l’algoritmo non è solo da considerare
come “cosa” propria dell’informatica e delle scienze in generale, ma anche estendibile ad altri
campi che con essa hanno veramente poco a che vedere. Per tale motivo ci era piaciuta quella
definizione che presentava l’algoritmo come qualcosa che è funzionale al raggiungimento di un
obbiettivo in generale.
13. Un metodo che prevede una serie di passi di numero definito per risolvere un determinato
problema, come la sequenza d'istruzioni di un programma.
Questa definizione contestualizza troppo il concetto di algoritmo per cui esso ci viene addirittura
presentato come un programma da far “girare” su un computer, contrariamente a quanto detto in
precedenza.
14. Un algoritmo è un insieme ordinato di passi eseguibili e non ambigui, che definiscono un
processo che termina.
Per la prima volta notiamo che le istruzioni devono essere effettivamente eseguibili. Pensiamo
infatti ad un’istruzione del tipo “calcola tutti i numeri primi”; sappiamo che ciò è impossibile data la
cardinalità infinita dell’insieme di un tale insieme, per cui un’istruzione del genere non potrà mai
essere effettivamente eseguibile. E’ significativo anche il richiamo al fatto che il processo deve
comunque terminare, in logico accordo con l’eseguibilità delle istruzioni.
Riteniamo sufficienti quattordici definizioni diverse di algoritmo per raggiungere il nostro scopo,
che è quello di “produrre” una definizione più chiara ed intuibile possibile di algoritmo, ma che sia
anche più che mai decontestualizzata.
Da un’analisi attenta che abbiamo condotto, siamo in grado di dare una definizione intuitiva,
semplice e didatticamente presentabile dell’algoritmo. La cosa che per noi è più importante è far
notare che non c’è bisogno di avere conoscenze di carattere informatico di base per comprendere
una tale definizione.
dr Valerio Curcio - Gli Algoritmi
13

L’algoritmo è:
Un metodo per risolvere un insieme di problemi tra loro simili (non necessariamente
uguali), dove per problema si intende la definizione di una situazione problematica che può
variare dall’usuale problema di matematica, all’obiettivo da raggiungere in un qualsiasi
gioco, allo scopo che ci si propone in un qualsiasi lavoro (basti pensare agli algoritmi di
decrittografia che venivano usati nella Seconda Guerra Mondiale per intercettare i
movimenti nemici).
Un’insieme ordinato di passi eseguibili e non ambigui, dove per passi intendiamo anche
le istruzioni. Pensiamo, per esempio, al gioco degli scacchi presente nelle settimane
enigmistiche quando si chiede di vincere in un certo numero di mosse.
Un processo che deve avere comunque un limite temporale (cioè deve “produrre” una
soluzione in un tempo finito). Non consideriamo algoritmo un insieme di istruzioni che
fanno riferimento a cicli infiniti. Così diciamo con assoluta certezza che un’istruzione del
tipo “gira su te stesso” non potrà mai costituire un algoritmo se non verrà specificato con
precisione un termine, per esempio “gira su te stesso per tre volte”.
L’algoritmo non è un programma: mentre un algoritmo è il procedimento da seguire per
risolvere un problema a prescindere dal linguaggio utilizzato, un programma consiste nella
descrizione di un algoritmo in uno specifico linguaggio di programmazione. In questo
ultimo punto abbiamo usato il corsivo in quanto qui viene presentato l’algoritmo come
“oggetto” esclusivamente informatico, inteso nel modo usuale (cioè non considerando
l’informatica come arte della risoluzione dei problemi, ma come materia che si riferisce
all’uso del computer).
In questa definizione che abbiamo formulato, volutamente, non abbiamo fatto riferimento a parole
ambigue e poco chiare come “classe di problemi”, “serie di istruzioni”, “procedura di calcolo”,
“macchina di Turing”, ecc…per rendere il tutto più accomodante ed intuitivo. Il concetto di
algoritmo deve essere patrimonio di tutti e non solo di una elite di bravi e diligenti studenti che
divorano volumi interminabili di informatica. La definizione di algoritmo da noi prodotta deve
essere tale da far comprendere alla nostra Rebecca che lei, pur non avendo mai incontrato per strada
una frazione da dividere, ha utilizzato algoritmi chissà quante volte nella sua vita senza saperlo.
Tutte le volte che ha giocato a dama con la sua amica, tutte le volte che ha giochicchiato a scacchi
con suo papà, tutte le volte che ha giocato al gioco del nove con le regole del gioco ben fissate in
mente, e perché no, anche quella volta che ha “ideato” i suoi piani per incontrare e conoscere il suo
amichetto del cuore. In questo paragrafo crediamo di aver risposto alle domande che ci siamo posti
dr Valerio Curcio - Gli Algoritmi
14

all’inizio in un modo che speriamo sia chiaro e semplice allo stesso tempo. Ma a noi piacerebbe
chiudere il paragrafo tentando do compattare la definizione di algoritmo in poche righe.
Definizione di algoritmo:
Un algoritmo è un insieme ordinato di passi eseguibili e non ambigui, il cui unico scopo è la
risoluzione di problemi tra loro simili e il cui processo (di risoluzione) deve essere
temporalmente limitato.
dr Valerio Curcio - Gli Algoritmi
15

4. Alcuni esempi di algoritmi
Iniziamo questo paragrafo in accordo con quanto asserito fin qua, cioè vogliamo che il primo
esempio di algoritmo sia il più intuibile e semplice possibile, ma che al tempo stesso sia tratto dalla
vita reale e sia più “intrigante” possibile affinché venga sollecitato l’interesse della nostra Rebecca.
L’esempio scelto riguarda un algoritmo di cifratura, cioè si tratta di un processo che codifica un
testo in modo tale da non poter più essere “leggibile” in modo corretto (in pratica se ne smarrisce il
significato).
Giovanni è un giovane che spesso usa il bancomat per prelevare denaro contante dalla sua banca.
Purtroppo non riesce a memorizzare il codice segreto della tessera per cui è costretto a scriverselo
su un fogliettino di carta che conserva nel portafogli. Giustamente pensa che perdendo un giorno il
portafogli potrebbe consegnare al fortunato “ritrovatore” tutti i mezzi necessari per il
prelevamento di contanti (bancomat + codice segreto) e decide quindi di inventarsi un sistema che
possa permettergli in modo univoco di ricordare il codice segreto, cioè utilizza un algoritmo ad hoc
che viene chiamato di codifica.
Il codice segreto del bancomat di Giovanni è 73546.
Giovanni decide di aggiungere il numero 3 ad ogni singola cifra del suo codice segreto, cioè lo
riscrive in questo modo:
codice: (7+3)(3+3)(5+3)(4+3)(6+3).
Ora nota che c’è un problema per quanto riguarda la prima cifra, in quanto 7+3=10 e quindi il
nuovo codice avrebbe una cifra in più e potrebbe quindi risultare di difficile decifratura (algoritmo
inverso che ci permette di tornare al codice originario).
Decide quindi di superare questa situazione potenzialmente problematica prendendo in
considerazione solo le unità, nel nostro esempio la cifra 0.
Il nuovo codice, corrispondente al codice segreto codificato è: 06879, che è del tutto diverso da
quello originario. Se il trovatore del portafogli di Giovanni applicherebbe questo codice per
prelevare i soldi non otterrebbe alcun risultato positivo, ma, come ben sappiamo, al terzo tentativo
fallito di inserimento del codice bancomat la scheda viene ritirata dallo sportello automatico,
proteggendo così il conto di Giovanni.
Questo, come già detto, è un esempio molto semplice e che crediamo possa rendere bene l’idea del
concetto di algoritmo. Vogliamo altresì sottolineare il fatte che Giovanni, pur avendo avuto la
genialità di applicare questo metodo, non è assolutamente cosciente di aver utilizzato un algoritmo
per risolvere il suo problema. Questa infatti è una delle innumerevoli e ricorrenti situazioni in cui lo
usiamo senza rendercene conto. Ma sarebbe bello dire alla nostra amica Rebecca che almeno una
dr Valerio Curcio - Gli Algoritmi
16

volta nella sua vita ha utilizzato un algoritmo di codifica, cioè quando ha inviato quella famosa email al professore, citata nel paragrafo introduttivo.
Ma siamo davvero sicuri che il processo utilizzato nell’esempio precedente sia effettivamente un
algoritmo?
Se abbiamo dubbi lo proviamo, filtrandolo attraverso la definizione che abbiamo dato nel paragrafo
precedente.
Esiste un problema da risolvere? Certo che si. Giovanni introduce questo processo per
“nascondere” il proprio codice segreto.
Arriva ad un risultato in tempo limitato? Lo abbiamo appena visto nell’esempio. In poco più
di un attimo Giovanni ha la soluzione al suo problema.
Le istruzioni date sono eseguibili e non ambigue? Per quanto riguarda l’eseguibilità, altro
non ha fatto che operare una semplice addizione usuale. Non c’è traccia di ambiguità in ciò
che Giovanni si è costruito perché la chiave (cioè il numero 3 da aggiungere) è predefinita e
non varia durante il processo, ma anche perché non lascia spazio a problemi nella decodifica
(bisogna solo che si ricordi che se il numero è inferiore alla chiave – cioè a 3 – significa che
è stato ottenuto considerando solo la cifra delle unità rispetto al risultato della somma).
Bene, ora siamo veramente convinti che abbiamo fatto un buon esempio di algoritmo, ma
soprattutto vogliamo insistere sul fatto che esso è “lontano” dall’uso del computer, distaccato da
determinate discipline, ma può essere riferito esclusivamente ad un episodio legato ad una
problematica di vita quotidiana.
Per completezza di informazione aggiungiamo che, come già accennato in precedenza, esiste
l’algoritmo inverso che prende il nome di decodifica, il cui scopo è, partendo dalla chiave,
rigenerare il codice segreto originario: è logico che questo algoritmo inverso viene eseguito dalla
mente!
Vediamo comunque con quale percorso si giunge al codice corretto (o decifrato), partendo da quello
cifrato che, se ci ricordiamo, è 06879 e la chiave è il numero 3.
Ci sono cifre inferiori al 3? Si c’è uno zero come prima cifra. Allora al posto di 0 scriviamo 10 e
facciamo la seguente operazione:
(10-3)(6-3)(8-3)(7-3)(9-3)
A questo punto otteniamo il codice originario operando semplicemente le sottrazioni nelle
parentesi:
otteniamo così il codice 73546, che è proprio il codice originario del bancomat di Giovanni!
dr Valerio Curcio - Gli Algoritmi
17

Logicamente anche questo è un algoritmo, se filtrato con la nostra definizione. Ma questa volta ci
fidiamo e non andiamo a “fare la prova”.
Adesso vogliamo riferirci ad una situazione problematica classica che tutti gli studenti, compresa la
nostra Rebecca, conoscono; parliamo del calcolo delle radici di una equazione di secondo grado del
tipo
ax 2 + bx + c = 0
Come potremmo “generare” un algoritmo risolutivo basandoci sulle nostre conoscenze?
Proviamo a fare in questo modo, cioè generiamo una sequenza di passi che possano portarci alla
soluzione del problema.
Calcoliamo il delta dell’equazione e distinguiamo i tre casi;
Caso delta negativo → esistono due soluzioni complesse coniugate;
Caso delta nullo → esiste una soluzione doppia pari a –b/2a;
Caso delta positivo:
Calcola le due soluzioni secondo la formula nota:
x1, 2 =
− b ± b 2 − 4ac
2a
Le due soluzioni sono x1 e x2.
Questo è un semplicissimo algoritmo matematico che abbiamo usato chissà quante volte.
Onestamente, quanti di noi hanno mai pensato che questo potesse essere un algoritmo risolutivo? Il
problema è sempre lo stesso; si considera l’algoritmo come un qualcosa da legare esclusivamente
all’utilizzo del computer per cui risulta difficile riconoscerlo nelle sue più svariate forme ed
applicazioni in ambiti che vanno al di là della “macchina”.
Domanda: possiamo usare l’algoritmo dell’esempio precedente per costruirne uno leggermente più
complesso? La risposta è si. Supponiamo di voler generare l’algoritmo risolutivo di una
disequazione di secondo grado.
Per semplicità consideriamo esclusivamente il caso a > 0. Possiamo schematizzare la nostra
sequenza di passi:
Guarda il segno della disequazione e calcola il delta;
Caso delta positivo:
Calcola le radici dell’equazione associata con l’algoritmo precedente;
Se il segno è “>” le soluzioni sono esterne alle due radici;
Se il segno è “<” le soluzioni sono interne alle radici;
dr Valerio Curcio - Gli Algoritmi
18

Caso delta nullo:
Calcola la radice doppia dell’equazione associata con l’algoritmo precedente;
Se il segno è “>” le soluzioni saranno tutte tranne la radice stessa;
Se il segno è “<” non ci sono soluzioni reali.
Caso delta negativo:
Se il segno è “>” la soluzione è tutto l’asse reale;
Se il segno è “<” non ci sono soluzioni reali.
Questo procedimento lo conosciamo da tantissimo tempo, ma ora l’abbiamo conosciuto sotto
un’altra veste cioè come algoritmo risolutivo. Se notiamo bene la sua formulazione, altro non
sembra se non un insieme di regole che vengono date come se fosse un gioco. Considerandolo in
questo modo forse ci si affiderebbe meno alla meccanicità dell’operazione da svolgere e si
capirebbero meglio i processi logici da seguire passo dopo passo.
Possiamo spingerci oltre e magari scrivere un semplicissimo programmino in un linguaggio di
programmazione ad alto livello (per esempio in Pascal) che traduca il nostro esempio di algoritmo
in modo che possa essere eseguito da un computer. In questo modo, paradossalmente, si coglie
meglio il senso di un algoritmo visto come cosa assolutamente distaccata ma necessaria per la
stesura di un programma.
Potremmo scrivere il nostro programmino in questo modo:
program diseq;
uses crt;
var a,b,c:integer;
x1,x2, delta:real;
segno:char;
begin
clrscr;
write('inserisci a>0 ');
readln(a);
write('inserisci b ');
readln(b);
write('inserisci c ');
readln(c);
write('inserisci segno < o > ');
readln(segno);
delta:=sqr(b)-4*a*c;
dr Valerio Curcio - Gli Algoritmi
19

if delta>=0 then
begin
x1:=(-b+sqrt(delta))/(2*a); x2:=(-b-sqrt(delta))/(2*a);
if segno='>' then
writeln('soluzione = x< ',x1:8:2,' e x > ',x2:8:2)
else
writeln('soluzione = ',x1:8:2,' < x < ',x2:8:2);
end;
else
begin
if segno='>' then
writeln('soluzione = per ogni x ')
else
writeln('soluzione = insieme vuoto');
end;
readln;
end.
Il nostro scopo non è quello di parlare di linguaggi di programmazione, ma questo semplice esempio
di programma scritto in Pascal serve a far vedere come un algoritmo possa essere tradotto in una
“lingua” che, detto in modo assolutamente intuitivo, il nostro computer è capace di comprendere.
Si possono fare infiniti esempi di algoritmi, ma abbiamo deciso di proporne l’ultimo che mette in
risalto le capacità superiori della mente umana rispetto ad una macchina.
Per far ciò utilizziamo un templi algoritmo che chiamiamo “attraversare la porta”:
1. controlla se la porta è aperta;
2. nel caso che la porta sia aperta salta il passo seguente;
3. apri la porta;
4. avanza di un metro oltre la porta.
Se diamo questo insieme di regole ad un essere umano (possiamo considerare un gioco in cui si
danno ordini ad un bambino che li deve eseguire) è estremamente facile eseguirle in un tempo
limitatissimo e senza alcuna difficoltà. Ma immaginiamo di dare queste informazioni ad una
macchina, ci rendiamo conto che la complessità diventa veramente elevatissima.
dr Valerio Curcio - Gli Algoritmi
20

Ci basta pensare al comando numero 3: come possiamo ordinare ad una macchina di aprire la porta
se non sa come si fa? Dovremmo introdurre un nuovo algoritmo da inserire nel precedente col nome
“apri la porta”, cioè il nostro algoritmo originario si complicherebbe e avrebbe una nuova forma:
1. controlla se la porta è aperta;
2. nel caso che la porta sia aperta salta il passo seguente;
3. apri la porta
protendi il braccio;
afferra la maniglia;
rotea la mano di 30° in direzione antioraria;
applica una pressione alla maniglia diretta di fronte a te;
…
4. avanza di un metro;
Potremmo anche continuare introducendo nuovi algoritmi come ad esempio “afferra la maniglia”, in
quanto dovremmo spiegare alla macchina come si fa per afferrare la maniglia, quali muscoli
muovere, come chiudere la mano, ecc…
Abbiamo visto come un semplicissimo insieme di istruzioni eseguibili dall’uomo in modo quasi
istantaneo e senza alcuna complessità diventa un percorso di definizione di mosse tortuosissimo se
lo si riferisce ad una macchina.
dr Valerio Curcio - Gli Algoritmi
21

5. Conclusioni
Abbiamo iniziato questo lavoro ponendoci come obiettivo il fornire risposte alle domande ricorrenti
dei nostri alunni, dei quali la nostra amica e compagna di viaggio Rebecca è stata degna
rappresentante, che vengono poste nel momento in cui si parla di argomenti ritenuti ingiustamente
“inusuali” nella didattica come può essere il concetto di algoritmo.
Abbiamo iniziato il nostro percorso partendo dalla lontana Babilonia del IX secolo d.C. per cercare
di scoprire l’origine della parola algoritmo, scoprendo che ci sono due versioni che non contrastano
poi così tanto: entrambi ci riportano al concetto di numero e a come operare con essi: siamo agli
albori dell’algebra.
Tornando ai tempi nostri abbiamo visto come il concetto di algoritmo può essere “separato” dal
contesto matematico-algebrico individuandone caratteristiche ben adattabili a situazioni di vita
quotidiana che apparentemente poco o nulla hanno a che vedere con le scienze. A tale proposito si è
parlato di algoritmi nelle pratiche giuridiche, ma anche ad algoritmi risolutori di situazioni
problematiche che si presentano in alcuni dei nostri giochi usuali, ma li abbiamo altresì introdotto
come la pianificazione strategica operata da Rebecca per “conquistare” il suo amichetto.
Siamo giunti così a definire l’algoritmo come qualcosa di universalmente accettabile ed intuibile,
anche e soprattutto per coloro che non possiedono concetti di base elaborati e specifici di una certa
materia piuttosto che di un’altra. Abbiamo quindi dato una definizione di algoritmo “per tutti” e ciò
ci è sembrato didatticamente corretto e significativo.
Ci siamo poi spinti oltre, mostrando alcuni esempi di algoritmi, ma siamo partiti volutamente dalla
risoluzione di una piccola situazione problematica tipica della vita quotidiana (un piccolo esempio
di codifica) per enfatizzare ancora una volta la decontestualizzazione del concetto di algoritmo
stesso. Ci siamo poi imbattuti in un paio di semplici algoritmi di risoluzione di problemi di
matematica (di uno dei quali abbiamo dato anche la traduzione in un linguaggio di programmazione
ad alto livello) il cui scopo è stato esclusivamente quello di mostrare un modo di procedere,
imparato ed utilizzato fino alla noia, nella sua nuova veste di algoritmo, sicuramente più bella ed
intrigante.
Alla fine abbiamo cercato di “smitizzare” la macchina facendo vedere come essa non sia neanche
lontanamente paragonabile alla mente umana. La formulazione dell’algoritmo è nata con “carta e
penna” ed è a questo che noi abbiamo voluto fare riferimento. L’utilizzo del computer ha la sua
grandissima importanza ed utilità, ma sarebbe grave ridurre l’informatica (ivi contenuto il concetto
di algoritmo) alla semplice pratica del computer. Concludiamo dicendo che ci sarebbe piaciuto
sapere se Rebecca avrebbe cambiato idea dopo aver letto questo lavoro.
Scarica