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.