Problema e algoritmo

Da quando si è diffuso l’uso del personal computer, la parola programma, nell’accezione informatica del termine, è entrata a far parte del vocabolario comune e oggi sta per essere sostituita, soprattutto dagli utilizzatori di dispositivi di ultima generazione come smartphone e tablet, con il termine app, contrazione della parola applicazione. I termini applicazione, programma e app sono sinonimi di software e si legano al fatto che tutti i dispositivi prima citati,  e che possiamo genericamente chiamare elaboratori elettronici, sono delle macchine non intelligenti, dei semplici esecutori di ordini impartiti dall’esterno attraverso le istruzioni codificate in codice binario (per convenzione sotto forma di zeri e uno) nel software.

Il software viene progettato e realizzato dai programmatori informatici che, per loro fortuna, hanno a disposizione una serie di strumenti software che li facilita nella scrittura dei programmi; primi fra tutti quelli che danno la possibilità di programmare in un linguaggio diverso da quello binario (linguaggio macchina) utilizzando dei linguaggi di programmazione molto più simili a quello dell’uomo.

L’esecutore

Un elaboratore elettronico è una macchina programmabile, dotata di una capacità di memorizzazione e di una velocità di elaborazione molto elevate, ma che non è fornita di intelligenza propria. Un elaboratore elettronico è solo un esecutore che, a seconda del programma che esegue, può essere utilizzato per risolvere problemi molto diversi fra loro, però tutto quello che deve fare bisogna sempre specificarglielo attraverso dei programmi. Un elaboratore elettronico è in grado di eseguire in maniera autonoma solo poche operazioni elementari, senza alcuna capacità critica o di ragionamento e sicuramente non è in grado di capire alcun problema, né tanto meno di trovare per esso una soluzione. In questo senso potremmo dire che: un elaboratore elettronico non è in grado di risolvere problemi, ma solo di eseguire programmi. In definitiva, se opportunamente programmato un elaboratore elettronico può essere utilizzato per risolvere problemi, ma non è in grado di risolvere problemi in maniera autonoma. Il passaggio dal problema al programma che lo risolve, infatti, non è affatto banale e merita qualche precisazione.

problemiDefinizione di algoritmo

In matematica e in altre scienze, in generale un problema è un quesito espresso attraverso un enunciato che, sulla base di dati noti, richiede di determinare dati non noti che sono logicamente deducibili dai primi attraverso calcoli ed elaborazioni. In informatica questa definizione viene estesa e il concetto di problema può essere assimilato a quello di compito da svolgere.

Infatti, i problemi che un elaboratore elettronico può risolvere eseguendo il programma opportuno, possono essere tra i più disparati, da quello dell’elaborazione dei testi, a quello del montaggio video o del fotoritocco, a quello della fatturazione o del calcolo degli stipendi in un’organizzazione, a quello del controllo del traffico aereo ecc.

Nel contesto della programmazione informatica, per la scrittura di un programma che costituisca la soluzione di un certo problema, è di fondamentale importanza saper distinguere fra risultato e soluzione: questi sono due termini che a volte nel linguaggio comune sono utilizzati come sinonimi, ma che in informatica indicano due cose molto diverse. Il risultato consiste nei dati finali, quelli attesi dalla risoluzione di un problema; la soluzione, invece, è il procedimento che permette di ottenere il risultato.

La soluzione di un problema in informatica viene più propriamente detta algoritmo.

DEFINIZIONE. Un algoritmo è una procedura risolutiva di un problema che deve essere costituita da un numero finito di (oper)azioni elementari per la cui esecuzione sia richiesto un tempo finito e che trasformano uno o più dati di partenza, che chiamiamo input, in uno o più dati risultato, che chiamiamo output.

(Per operazione elementare s’intende un’operazione che l’esecutore è in grado di eseguire in maniera autonoma, per approfondire: I passi elementari di un algoritmo).

Un algoritmo deve essere deterministico, esso cioè deve produrre sempre lo stesso output in corrispondenza dello stesso input; esso, inoltre, deve essere generale, deve cioé definire un procedimento che sia valido per determinare l’output in corrispondenza di tutti gli input appartenenti al dominio del problema. Ovvero, un algoritmo non deve risolvere solo un singolo caso o un numero ristretto di casi, ma tutta la classe di problemi che differiscono per i dati iniziali. In altri termini, per quel problema esso deve fornire all’esecutore una ben definita procedura da eseguire, qualunque sia l’input fra quelli ammissibili.