Dal problema alla soluzione eseguibile
Uno degli errori più comuni quando si parla di informatica consiste nel confondere tre livelli distinti: il problema, la procedura e l’algoritmo. Sembrano concetti vicini, e in parte lo sono, ma non indicano la stessa cosa. Un problema è una situazione da risolvere. Una procedura è un modo possibile per affrontarla. Un algoritmo, invece, è una sequenza finita, ordinata e determinata di passi che permette di ottenere un risultato a partire da dati iniziali definiti.
Questa distinzione è fondamentale perché l’informatica non nasce quando qualcuno “ha un’idea” o “vuole risolvere qualcosa”. L’informatica comincia davvero quando un problema viene trasformato in una struttura eseguibile. Il passaggio decisivo non è emotivo, intuitivo o generico: è formale. Bisogna prendere una situazione aperta, chiarire quali siano i dati disponibili, stabilire quale risultato si vuole ottenere, definire le operazioni necessarie e organizzare tali operazioni in una sequenza controllabile.
In questo senso, il pensiero algoritmico è una forma di disciplina. Non basta sapere dove si vuole arrivare. Bisogna costruire un percorso che possa essere seguito senza ambiguità. L’algoritmo è proprio questo: non il desiderio della soluzione, ma la sua architettura operativa.
Un problema non è ancora una soluzione
Un problema nasce quando esiste una distanza tra uno stato iniziale e uno stato desiderato. Ho un insieme di dati e voglio ordinarli. Ho una lista di numeri e voglio trovare il più grande. Ho una strada da percorrere e voglio arrivare a destinazione. Ho una ricetta da preparare e voglio ottenere un piatto finito. In tutti questi casi esiste una domanda pratica: come passare dalla situazione iniziale al risultato finale?
Il problema, però, non contiene automaticamente la soluzione. Dire “voglio trovare il numero maggiore in una lista” non significa avere già un metodo. Significa soltanto avere definito un obiettivo. Allo stesso modo, dire “voglio arrivare a Torino” non equivale a conoscere il percorso, il mezzo di trasporto, le deviazioni, i tempi e le condizioni della strada.
Questa separazione è decisiva. Molte formulazioni sembrano soluzioni solo perché sono espresse in modo deciso, ma in realtà restano semplici dichiarazioni di intento. “Bisogna fare ordine”, “bisogna trovare il dato giusto”, “bisogna calcolare il risultato”, “bisogna migliorare il sistema”: tutte queste frasi descrivono un’esigenza, non ancora una soluzione.
Un problema, per diventare trattabile, deve essere precisato. Occorre stabilire quali siano gli input, quale sia l’output atteso, quali condizioni debbano essere rispettate e quali operazioni siano ammesse. Finché questi elementi restano vaghi, non esiste ancora un vero processo computazionale. Esiste soltanto una richiesta.
Una procedura non è ancora un algoritmo
Il secondo livello è la procedura. Una procedura è un insieme di indicazioni operative per affrontare un compito. Può essere utile, può essere ragionevole, può funzionare in molti casi, ma non sempre possiede la precisione necessaria per essere considerata un algoritmo in senso pieno.
Prendiamo un esempio semplice: “per preparare un tè, scalda l’acqua, metti la bustina nella tazza, versa l’acqua e attendi qualche minuto”. Questa è una procedura comprensibile per un essere umano. Tuttavia contiene elementi vaghi: quanto deve essere calda l’acqua? Quanto tempo bisogna attendere? Quanta acqua serve? Che cosa significa esattamente “qualche minuto”? Per una persona esperta queste ambiguità non sono un problema, perché il contesto, l’esperienza e l’intuizione colmano i vuoti. Per una macchina, invece, quei vuoti sono fratture operative.
La procedura appartiene ancora a un livello parzialmente umano. Può tollerare approssimazioni, sottintesi, adattamenti e interpretazioni. L’algoritmo no. Un algoritmo deve essere specificato in modo tale che ogni passo sia determinato. Non deve chiedere all’esecutore di “capire più o meno” che cosa fare. Deve indicare esattamente quale operazione eseguire, in quale ordine, con quali condizioni di arresto.
Questa è la differenza essenziale: una procedura può orientare l’azione; un algoritmo deve determinarla.
L’algoritmo come sequenza finita e determinata di passi
Un algoritmo può essere definito come una sequenza finita di istruzioni non ambigue che, a partire da un insieme di dati iniziali, conduce a un risultato oppure termina dichiarando che il risultato non è ottenibile nelle condizioni date.
In questa definizione sono contenuti quattro elementi fondamentali: finitezza, determinatezza, eseguibilità e trasformazione.
Il primo elemento è la finitezza. Un algoritmo non può essere una sequenza infinita di operazioni senza termine. Deve prevedere una condizione di arresto. Può concludersi con una soluzione, con un errore controllato o con l’indicazione che l’input non soddisfa certe condizioni, ma deve comunque terminare.
Il secondo elemento è la determinatezza. Ogni passo deve essere chiaro. Se un’istruzione può essere interpretata in modi diversi, non è ancora formulata algoritmicamente. Dire “scegli un numero adatto” non è una vera istruzione algoritmica, a meno che non venga definito che cosa significhi “adatto”.
Il terzo elemento è l’eseguibilità. Le operazioni devono poter essere effettivamente compiute dall’esecutore previsto. Un algoritmo per un computer deve usare operazioni traducibili in istruzioni, dati, confronti, assegnazioni, cicli, funzioni o strutture equivalenti. Un algoritmo per una persona può usare azioni pratiche, ma anche in quel caso deve essere realizzabile.
Il quarto elemento è la trasformazione. Un algoritmo non è una lista morta di frasi. È un processo che trasforma uno stato iniziale in uno stato finale. Prende input, applica regole, modifica dati, produce output. Questa è la sua natura profonda: una macchina concettuale di trasformazione.
Un esempio non informatico: trovare una stanza
Immaginiamo di dover trovare la stanza 214 in un edificio scolastico o amministrativo.
Il problema è: trovare la stanza 214.
Una procedura generica potrebbe essere: entra nell’edificio, guarda i cartelli, cerca il secondo piano, poi cerca la stanza. Questa procedura è utile, ma lascia molte cose implicite. Che cosa fare se non ci sono cartelli? Che cosa fare se esistono più scale? Che cosa fare se la numerazione non è continua? Che cosa fare se la stanza non esiste?
Una versione più algoritmica sarebbe: entra dall’ingresso principale; cerca una mappa; se la mappa indica la stanza 214, identifica il piano; se la mappa non la indica, chiedi informazioni; raggiungi il secondo piano; cerca il corridoio con le stanze numerate da 200 a 299; percorri il corridoio; se trovi la stanza 214, fermati; se arrivi alla fine senza trovarla, torna alla portineria e segnala che la stanza non è stata trovata.
Qui la differenza è netta. Non abbiamo più soltanto una direzione generale. Abbiamo condizioni, controlli, alternative e arresto. La procedura si è trasformata in un processo più determinato.
Un esempio informatico: trovare il numero maggiore
Consideriamo ora un esempio classico: trovare il numero maggiore in una lista.
Il problema è: data una lista di numeri, individuare il valore massimo.
Una procedura vaga potrebbe essere: guarda tutti i numeri e scegli il più grande. È comprensibile, ma non ancora sufficiente per una macchina. Una macchina non “guarda” nel senso umano del termine e non “sceglie” per intuizione. Deve confrontare valori secondo regole precise.
Una formulazione algoritmica semplice può essere questa: prendi il primo numero della lista e chiamalo massimo corrente; passa al numero successivo; confronta il numero attuale con il massimo corrente; se il numero attuale è maggiore, aggiorna il massimo corrente; se non è maggiore, lascia invariato il massimo corrente; ripeti il procedimento fino alla fine della lista; quando non ci sono più numeri da controllare, restituisci il massimo corrente.
Questo è un algoritmo perché stabilisce una sequenza finita di passi, usa operazioni definite, contiene una condizione di avanzamento e produce un risultato. Non si limita a dire “trova il più grande”: mostra come farlo.
Perché la precisione cambia tutto
La precisione algoritmica non è pignoleria. È la condizione che rende possibile l’esecuzione automatica. Un essere umano può compensare istruzioni incomplete con esperienza, buon senso, memoria, contesto e capacità interpretativa. Un computer, invece, esegue ciò che è stato formalizzato. Non possiede automaticamente il significato umano del problema. Opera su rappresentazioni.
Questo punto è cruciale per capire l’informatica: il computer non risolve problemi perché “capisce” come una persona. Risolve problemi quando il problema è stato tradotto in una forma operativa compatibile con la macchina. Il cuore del lavoro informatico sta proprio in questa traduzione.
Per questo un algoritmo non è semplicemente una lista di comandi. È il risultato di un’analisi. Prima bisogna capire il problema. Poi bisogna individuare i dati. Poi bisogna definire il risultato atteso. Poi bisogna costruire una sequenza di trasformazioni. Solo alla fine quella sequenza potrà essere tradotta in codice.
Algoritmo e programma non sono la stessa cosa
A questo punto è utile introdurre una distinzione ulteriore. Un algoritmo non coincide ancora con un programma. L’algoritmo è la struttura logica della soluzione. Il programma è una sua implementazione concreta in un linguaggio di programmazione, su una determinata macchina o piattaforma.
Lo stesso algoritmo può essere scritto in C, Python, JavaScript, PHP o in un altro linguaggio. Può essere eseguito su computer diversi. Può essere espresso in pseudocodice, in diagramma di flusso o in forma matematica. La sua identità non dipende dal linguaggio usato, ma dalla struttura dei passi che definiscono la trasformazione.
Questo chiarisce un punto essenziale: programmare non significa soltanto scrivere codice. Scrivere codice senza aver compreso il problema e senza aver costruito una strategia algoritmica significa produrre istruzioni fragili. Il codice è la superficie visibile. L’algoritmo è l’ossatura logica. Il problema è la tensione iniziale che richiede una soluzione.
Dal pensiero comune al pensiero computazionale
Nel pensiero comune, spesso si passa troppo rapidamente dal problema alla risposta. Si vuole “fare qualcosa”, “sistemare qualcosa”, “automatizzare qualcosa”. Ma l’informatica impone un passaggio più severo: chiede di trasformare l’intenzione in struttura.
Questa trasformazione è il primo vero nucleo del pensiero computazionale. Non si tratta di pensare come una macchina, ma di costruire processi che una macchina possa eseguire. La differenza è importante. L’essere umano formula obiettivi, interpreta contesti, valuta significati. La macchina manipola stati secondo regole. L’algoritmo è il ponte tra questi due mondi.
Ogni algoritmo è quindi una forma di cristallizzazione del pensiero. Prende un problema mobile, ancora aperto, e lo riduce a passaggi controllati. Questa riduzione non impoverisce il pensiero: lo rende operativo. Come in una macchina ben costruita, ogni pezzo deve avere una funzione, ogni movimento deve avere una direzione, ogni trasformazione deve produrre un effetto determinato.
Conclusione
Problema, procedura e algoritmo appartengono a tre livelli diversi. Il problema definisce ciò che deve essere risolto. La procedura indica un possibile modo di agire. L’algoritmo formalizza una soluzione in una sequenza finita, chiara ed eseguibile di passi.
Confondere questi livelli significa indebolire il pensiero informatico. Un problema non è ancora una soluzione. Una procedura non è ancora un algoritmo. Un algoritmo non è ancora necessariamente un programma. Ogni livello richiede una trasformazione ulteriore.
Da qui nasce la forza dell’informatica: dalla capacità di prendere una domanda, analizzarla, scomporla, formalizzarla e renderla eseguibile. Il calcolo non è semplice attività meccanica. È trasformazione regolata. L’algoritmo è la forma in cui questa trasformazione diventa chiara, ripetibile e controllabile.
Prima di scrivere codice, quindi, bisogna saper distinguere. Che cosa sto cercando di risolvere? Quali dati possiedo? Quale risultato voglio ottenere? Quali passi conducono dal primo stato al secondo? Quando il processo deve fermarsi? Solo quando queste domande trovano una risposta precisa, il problema comincia davvero a diventare informatica.