Sei sulla pagina 1di 50

Introduzione

agli Algoritmi

Marzio Pennisi

1
Argomenti trattati

Algoritmi;
P ropri e t degli Algoritmi;
Descrizione;
C o s t a n t i e V a ria bili;

Proposizioni e Predicati;

D i a g r a m m i a blocchi;

S c h e m i f o n d a m e n t a l i di
Composizione;

A l g o r i t m i i t e r a t i v i e A l g o r i t m i r i c o r s i v i
Algoritmo: definizione

Il procedimento di analisi e p r o g r a m m a z i o n e l'insieme di tutte quelle attivit


che servono per risolvere problemi utilizzando un elaboratore, e che vanno dalla
formulazione del problema fino alla predisposizione dell'elaboratore.
Scopo dell'analisi quello di definire un algoritmo .

ALGORITMO: un elenco finito di istruzioni che specificano una


serie di operazioni, eseguendo le quali possibile risolvere ogni
problema di u n dato tipo (classe di problemi).

Un algoritmo pu essere utilizzato per risolvere un particolare problema. Il problema


deve essere del tipo del quale l'algoritmo fornisce la soluzione.

In questo caso l'uomo pu eseguire le istruzioni indicate nell'algoritmo sui


dati che caratterizzano il particolare problema da risolvere.

Un algoritmo n o n pu essere eseguito direttamente da un elaboratore.


Programma: definizione

Scopo della programmazione quello di definire un


programma.

Un programma la descrizione di cosa deve


fare un elaboratore (insieme univoco di
istruzioni) per risolvere ogni problema di
un dato tipo.

Un programma eseguibile da parte di un


elaboratore

Programma -> descrizione di un algoritmo in una


forma comprensibile per lelaboratore
Linguaggio di programmazione: definizione

Un linguaggio di programmazione un linguaggio rigoroso che


permette di descrivere un algoritmo in modo che esso diventi
un programma, cio in modo che esso possa essere eseguito da
un elaboratore.

La soluzione di un particolare problema di un dato tipo si


ottiene eseguendo il programma formulato per la soluzione
di quel tipo di problemi e specificando i dati caratteristici
del problema particolare.

I risultati ottenuti dalla esecuzione del programma


rappresentano la soluzione richiesta.

Lesecuzione di un programma anche detta elaborazione.


Analogie tra u o m o ed elaboratore

ANALISI PROGRAMMAZIONE

ALGORITMO PROGRAMMA
+ +
DATI DATI

ESECUZIONE DA PARTE
ESECUZIONE DA PARTE
DELLUOMO +
DELLELABORATORE
MACCHINA CALCOLATRICE

RISULTATO RISULTATO
Analisi e p r o g r a m m a z i o n e
Schema per la soluzione di problema
nuovi classi di problemi

ANALISI

algoritmo

PROGRAMMAZIONE

Schema per la soluzione


programma
di problemi gi risolti
con nuovi dati dati + elaboratore

ELABORAZIONE

risultato
Primi esempi di algoritmo
Esempio: Ordinamento di un mazzo di 40 carte

Problema: Si supponga di avere un mazzo da 40 carte mescolato. Si vuole


ordinare il mazzo di carte in modo che le carte con il seme cuori siano poste
per prime, seguite dalle carte con seme quadri, fiori e picche. Le carte di uno
stesso seme sono ordinate dall'asso al re.

Algoritmo (possibile):

1. inizio dellalgoritmo;

2. Suddividere il mazzo in 4 mazzetti; ciascun mazzetto costituito da tutte le carte

dello stesso seme;

3. Ordinare le carte di ciascun mazzetto dallasso al re;

4. Prendere nellordine il mazzetto dei cuori, dei quadri, dei fiori e delle picche;

5. fine dell'algoritmo.
Primi esempi di algoritmo (segue)
Esempio: Calcolo delle radici delle equazioni di secondo grado.

Problema: Determinare le radici x1, x2, dellequazione di secondo grado ax 2 +bx+ c=0. Il
procedimento prevede il calcolo del determinante =b 2 - 4ac. Se > 0 si hanno due radici
reali e distinte x1 e x2 = [-b () ] /2a. Se = 0 si hanno due radici reali coincidenti x1
e x2 = -b/2a. Se < 0 non si hanno radici nel campo dei numeri reali.

Algoritmo (possibile):

1. inizio dellalgoritmo;

2. Introdurre i valori di a, b e c;

3. Calcolare =b 2 - 4ac ;

4. Se > 0 porre x1=[-b + () ] /2a e x2=[-b - () ] /2a e poi passare allistruzione 7 ;

5. Se = 0 porre x1=x2= -b /2a e poi passare allistruzione 7 ;

6. Se < 0 restituire il messaggio non esistono radici reali e poi passare allistruzione 8 ;

7. Restituire x1 e x2;

8. Fine dellalgoritmo.
Algoritmo: istruzioni e dati

Fino ad adesso sono state utilizzate delle proposizioni per descrivere un algoritmo.
Le proposizioni sono composte di due parti:

operazioni da eseguire (ISTRUZIONI)


oggetti sui quali eseguire le operazioni al fine di ottenere i risultati (DATI).

Esempi sugli algoritmi appena visti:

ISTRUZIONI DATI

calcola b2 - 4ac 4, a, b, c,
porre.x1=x2 x1 e x2
suddividere in quattro mazzetti mazzo di carte
I DATI: Costanti e variabili

Gli oggetti (dati) sui quali si opera per mezzo d i un algoritmo


sono solitamente di 2 tipi:

costante: tipo di dato che rimane sempre lo stesso durante una


esecuzione dellalgoritmo e anche per esecuzioni diverse dello
stesso algoritmo.

Variabile: U n a variabile una coppia <nome,valore>. Essa pu


essere immaginata come una scatola sulla quale scritto un
nome. Questa scatola pu contenere u n valore che pu
cambiare durante lesecuzione dellalgoritmo.

valore

nome
Costanti e variabili

Data una variabile <x,v> si dice che x il nome della variabile e che v il
valore attuale della variabile di nome x (oppure, pi semplicemente, che v il
valore di x).

Un dato variabile risulta indeterminato al momento della definizione


dell'algoritmo;

il dato per corrisponde a un valore ben preciso durante ogni esecuzione


dellalgoritmo.

Esempio: Radici di una equazione di 2 grado.


Si consideri il passo 3 " =b 2 - 4ac " i dati a, b, c non corrispondono a nessun
valore finch non si esegue l'algoritmo per una ben precisa equazione di 2grado,
ad esempio x2 - 9x - 4 = 0.

Solo durante lesecuzione dellalgoritmo (in particolare al passo 2) possibile stabilire


che i nomi a, b, c corrispondono, rispettivamente, ai numeri 1; - 9; - 4!
Listruzione di assegnamento

Listruzione di assegnamento (assegnazione) o, pi semplicemente, assegnamento quella


particolare istruzione che permette di definire il valore attuale di una variabile.

Quel valore resta inalterato finch una successiva assegnazione non modifica il
valore stesso.

L'assegnazione rappresentata da

La forma generale dellassegnazione :

nome di variabile espressione

e si legge: assegna a nome di variabile il valore di espressione.

L'espressione a destra di deve essere formata utilizzando costanti, nomi di variabili


e/o simboli di operazione.
Assegnazione (segue)

A d esempio,se abbiamo

b c

dopo loperazione di assegnazione a b + c

a b c
Utilit delle assegnazioni
Con l'utilizzo delle variabili e della assegnazione possibile esprimere in modo
pi conciso le azioni descritte in un algoritmo. Ad esempio, una operazione
come "calcolare il volume di un parallelepipedo per mezzo del prodotto dei
valori delle tre dimensioni" pu essere espressa come:

volume lunghezza X larghezza X altezza

I nomi delle variabili sono arbitrari;

di solito opportuno scegliere il nome di una variabile in modo che ricordi il


significato del valore associato.

In un algoritmo sempre necessario rispettare la regola dellordinamento:

Ogni volta che una variabile compare a destra di una operazione di assegnazione
necessario che a quella variabile sia stato precedentemente gi associato un
valore!!!
Algoritmo: Tipi di istruzione

a. istruzioni operative: istruzioni che effettivamente producono dei


risultati, se eseguite;
b. istruzioni di controllo: istruzioni che controllano il verificarsi o meno
di condizioni specificate. In base al risultato del controllo
determinano lesecuzione di alcune istruzioni anzich altre.
c. Istruzioni di salto: istruzioni che alterano il normale ordine di
esecuzione dellalgoritmo, specificando esplicitamente quale sia la
successiva istruzione da eseguire.
Due tipologie:
Salto condizionato: l'effettiva esecuzione del salto sia vincolata
al verificarsi di una condizione specificata (include al suo interno
una istruzione di controllo).
Salto incondizionato: che il salto viene eseguito tutte le
volte che l'istruzione eseguita;
Algoritmo: tipi di istruzione (segue)

d. istruzione di inizio esecuzione: indica linizio dellesecuzione


dell'algoritmo ;
e. istruzione di fine esecuzione: indica la fine dell'esecuzione
dell'algoritmo;
f. istruzione di I/O (o trasmissione): indicano co m e una
trasmissione d i dati o messaggi debba avvenire tra lalgoritmo e
lambiente esterno.
Possono essere:
d i ingresso o i n p u t (di lettura): i valori vengono trasmessi da
u n ambiente esterno all'interno dell'algoritmo oppure istruzioni
di uscita o o u t p u t (di s c r i t t u r a ): i valori debbono essere
trasmessi dall'algoritmo verso l'ambiente esterno.
Esempio tipo di ''istruzione''(algoritmo radici
equazione secondo grado)

1. inizio dellalgoritmo;
Istruzione di inizio esecuzione

2. Introdurre i valori di a, b e c; Istruzione di input

3. Calcolare b 2 - 4ac ; Istruzione operativa


Istruzione di salto
4. Se > 0 porre x1 [-b + () ] /2a e x2 [-b - () ] /2a e poi passare allistruzione 7 ;
Istruzioni Istruzione di salto
di 5. Se = 0 porre x1 x2 -b /2a e poi passare allistruzione 7 ;
controllo Istruzione di salto
6. Se < 0 restituire il messaggio non esistono radici reali e poi passare allistruzione 8 ;

7. Restituire x1 e x2; Istruzione di output

8. Fine dellalgoritmo. Istruzione di fine esecuzione


Proposizioni e predicati
Una proposizione un costrutto linguistico del quale si pu dire
se vero o falso. Ad esempio:
Roma la capitale della Francia;
3 un numero intero;
1 un numero dispari;
sono proposizioni; la prima falsa altre due sono vere.
Viceversa le seguenti non sono proporzioni
Luigi, leggi quel libro!
arrivederci a tutti.

Il valore di verit di una proposizione l'essere vera o falsa.

Una proposizione un predicato se in essa appaiono delle variabili, e il valore


variabili determina il valore di verit della proposizione stessa.

Esempio:
la variabile et minore di 30;
la variabile base ha un valore maggiore di quello della variabile altezza
Valutazione di un predicato
Valutazione del predicato l'operazione che permette di determinare se il
predicato vero o falso sostituendo alle variabili i loro valori attuali.
I due valori "vero" o "falso" sono detti valori logici o valori booleani.

In forma pi concisa possiamo scrivere:

et < 30 base > altezza

Per la scrittura dei predicati possibile utilizzare i seguenti simboli, detti


o p e r a t o r i relazionali oppure o p e r a t o r i d i confronto:
= uguale diverso
> maggiore < minore
maggiore o uguale minore o uguale

I predicati che contengono un solo operatore relazionale sono detti


predicati semplici.
Predicati composti
inoltre possibile utilizzare allinterno di un predicato i seguenti operatori booleani:
AND (indicato anche con ^ )
OR ( indicato anche con v )
NOT (indicato anche con il simbolo di soprasegnato)
I predicati nei quali compare almeno un simbolo NOT, AND, OR sono detti predicati composti.
La tavola di verit di un predicato composto un modo di descrivere il significato un predicato.
Essa consiste nello specificare il valore del predicato per ognuna delle possibili
combinazioni degli argomenti del predicato.

Le tavole di verit dei predicati p AND q e p OR q sono le seguenti:

p AND q p q p OR q p q
vero vero vero vero vero vero

falso vero falso vero vero falso


falso falso vero vero falso vero
falso falso falso falso falso falso
Analisi di algoritmi

Un algoritmo si ottiene come risultato di un procedimento di analisi che


pu essere suddiviso in tre fasi:

a) definizione del problema: non si deve riferire ad un caso


concreto, ma casi generali.
b) scelta del metodo di soluzione: in base alle conoscenze
possedute si definisce il metodo da seguire per risolvere il
problema;
c) descrizione delle operazioni o sviluppo dellalgoritmo: una
volta scelto il metodo si descrivono le operazioni che devono
essere eseguite per risolvere il problema scelto.
Analisi di algoritmi. Metodo delle
scomposizioni successive
Il punto di partenza la definizione del problema. Si ottiene poi una prima
scomposizione del problema scomponendo il problema in sottoproblemi e scegliendo per
ciascuno di essi il metodo di soluzione.

Ciascun sottoproblema pu successivamente essere riformulato fornendo una


descrizione sempre pi dettagliata ottenendo cos una seconda scomposizione del problema,
una terza scomposizione del problema e cos via fino ad ottenere una scomposizione, detta
scomposizione finale del problema che contenga solo descrizioni di operazioni direttamente
eseguibili.
Questa successione di operazioni direttamente eseguibili lalgoritmo.

Nei problemi particolarmente semplici, la prima scomposizione pu essere


direttamente composta da operazioni direttamente eseguibili.

Il metodo delle scomposizioni successive risulta particolarmente utile quando i


problemi da risolvere sono complicati. Gli esempi successivi sono introdotti soprattutto a scopo
illustrativo.
Analisi di algoritmi (segue)
Esempio: Calcolare l a somma delle prime n potenze del 2. noto che:

Pertanto questa notazione algebrica fornisce il metodo per la soluzione del


problema posto. In questo caso la scelta del metodo coincide con la descrizione
delle operazioni
direttamente eseguibili.
L'algoritmo, ottenuto direttamente come prima scomposizione del
problema, :

1) Inizio dellalgoritmo
2) acquisire dallesterno il valore di n;
3) a 2n
4) b a - 1
5) c a + b
6) Restituire c
7) Fine dellalgoritmo
Analisi di algoritmi (segue)
Metodologie per la soluzione dei problemi

Come gi detto, in base alle conoscenze possedute si definisce il metodo da


seguire. Ad esempio, se si conoscono le formule per il calcolo delle radici
dellequazione di secondo grado, possibile usare quelle.

Per molti problemi (ad esempio algoritmi di ordinamento e cammino minimo)


possibile utilizzare delle metodologie pi avanzate

La scomposizione del problema in sottoproblemi pi piccoli (e quindi pi


semplici da risolvere) o approccio top-down un possibile procedimento per
approcciarsi ad un problema. Questo tipo di approccio anche conosciuto come
divide et impera o divide and conquer

Un altro approccio di che pi essere utilizzato lapproccio bottom up, che


parte dal caso base (semplice) e costruisce via via una soluzione generale.

26
Flowcharts
( diagrammi di flusso o a blocchi)

La diagrammazione a blocchi un possibile linguaggio


generalizzato per la rappresentazione degli algoritmi -

Il diagramma a blocchi o flowchart permette di realizzare una


descrizione grafica di un algoritmo

Un diagramma a blocchi indica il flusso (cio la


sequenza) delle operazioni da eseguire per realizzare la
trasformazione, descritta nell'algoritmo, dei dati iniziali per
ottenere i risultati finali.
Flowcharts (segue)

Un particolare simbolo grafico, detto blocco


e l e m e n t a r e o pi semplicemente blocco ,
associato ad ogni tipo di istruzione.

Ogni istruzione dellalgoritmo rappresentata


all'interno di un blocco la cui forma
grafica determinata dal tipo dellistruzione.

I blocchi sono collegati tra loro d a frecce che


indicano gli schemi di flusso, cio il susseguirsi
delle azioni elementari.
Flowcharts (segue)

Un diagramma a blocchi un insieme di blocchi


elementari costituito da:

a) un blocco iniziale;
b) un blocco finale;
c) un numero finito n (n 1) di blocchi di azione
e/ o di lettura-scrittura
d) un numero finito m (m 0) di blocchi di
controllo
Flowcharts (segue)

BEGIN END

Blocco di inizio Blocco finale

falso vero
A

Blocco operativo Blocco di controllo

LEGGI A SCRIVI A

Blocco di I/O (lettura) Blocco di I/O (scrittura)


Flowcharts: calcolo (segue)
Flowcharts (segue)
Esempio: Diagramma a b l o c c h i d e l l ' a l g o r i t m o p e r il c a l c o l o di
M .C.D. (a,b)
Flowcharts (segue)

Si noti come l'operazione "scambiare i valori di a e b" stata realizzata con la sequenza di assegnazioni

Infatti per scambiare i valori di due variabili sempre necessaria una variabile di appoggio (in
questo caso x) in quanto l'assegnazione distruttiva nel senso che quando si assegna un nuovo
valore ad una variabile non si ha memoria del suo valore precedente. Pertanto se le variabili a e
b fossero:

una sequenza di
assegnazioni

avrebbe come effetto


Schemi fondamentali di composizione
Fra tutti i possibili schemi di flusso ne esistono alcuni che sono detti schemi
f o n d a m e n t a l i d i composizione; essi sono i seguenti.

N.B. Ogni schema fondamentale ha un unico punto di ingresso ed un unico punto di uscita.

Schema di sequenza
Mette in evidenza la composizione di n schemi di flusso che devono essere eseguiti
uno dopo l'altro. Graficamente appare come:
S c h e m i f o n d a m e n t a l i di c o m p o s i z i o n e (segue)

Schema di selezione
Esiste un blocco di controllo. La condizione indicata determina due diversi
comportamenti; uno da seguire nel caso che la condizione abbia valore di verit vero, laltro
nel caso abbia valore di verit falso.
Schemi di iterazione
Mette in evidenza il fatto che uno stesso schema S deve essere ripetutamente eseguito pi volte. Due possibili
modi di iterazione sono illustrati nellimmagine seguente:

a) lo schema S pu anche non essere mai eseguito, nel caso che la condizione C sia subito falsa
b) S eseguito sempre almeno una volta.

In a) S eseguito finch la condizione C vera (iterazione per vero) sulla condizione C;


in b) si ha una iterazione per falso ( S eseguito finch la condizione C falsa).

Gli schemi di flusso sono aperti quando si ha una sola esecuzione di una sequenza di blocchi elementari;
Gli schemi di flusso sono chiusi quando si pu avere pi di una esecuzione di una sequenza di blocchi elementari.

Gli schemi di sequenza e di selezione sono aperti, lo schema di iterazione chiuso.


I Cicli
Un ciclo rappresenta un particolare schema di iterazione.

Un ciclo definito quando si conosce a priori il numero di volte che deve essere eseguito. Un ciclo
definito detto anche ciclo enumerativo.

In questo caso si usa la tecnica del contatore: una variabile, detta contatore del ciclo, che conta
quante volte istruzioni del ciclo sono state eseguite.

Il contatore del ciclo pu essere utilizzato in due modi:

Incremento del contatore: il contatore viene inizializzato ad un valore minimo, ad esempio 0, e


incrementato di uno tutte le volte che il ciclo eseguito. Si ha una uscita dal ciclo quando il
valore del contatore uguale al numero prefissato di volte che il ciclo deve essere eseguito (vedi
esempio precedente).

Decremento del contatore: il contatore viene inizializzato con un valore uguale al numero di volte
che il ciclo deve essere eseguito e decrementato di uno ogni volta che il ciclo eseguito. Si ha una
uscita quando il valore del contatore raggiunge il valore 0.

Un ciclo indefinito quando non possibile conoscere a priori quante volte deve essere eseguito.
In questo caso la condizione di fine ciclo viene fatta controllando valore di una o pi variabili. I valori di
queste variabili sono modificati da istruzioni che fanno parte della iterazione.
Algoritmi iterativi
Accade molto spesso che, per risolvere un problema, un lo stesso insieme di operazioni debba essere
eseguito un numero opportuno di volte.

Consideriamo ad esempio il seguente problema:


Calcolare la somma dei cubi dei tre numeri interi successivi ad un valore dato n.
(n+1)3+(n+2)3+(n+3)3
Un possibile algoritmo il seguente:
Algoritmi iterativi (segue)

Il risultato ottenuto usando la variabile somma


come un contenitore di somme parziali finch
non si ottiene la somma totale richiesta.

Questo risultato viene raggiunto eseguendo delle


azioni "simili" per un numero opportuno di volte.

Lo stesso risultato pu essere ottenuto


modificando leggermente le istruzioni cos che
lalgoritmo sia composto da un numero prefissato
di azioni uguali:
Algoritmi iterativi (segue)
In questo modo il valore finale di somma ottenuto mediante lesecuzione, per una sola volta,
della sequenza di istruzioni

E dalla esecuzione per tre volte della sequenza di istruzioni


Algoritmi iterativi (segue)
Algoritmi ricorsivi
Gli algoritmi ricorsivi sono algoritmi che richiamano se stessi per la risoluzione di un problema.

Molto semplici da scrivere e pensare, ma meno efficienti sul calcolatore degli algoritmi iterativi.

L'algoritmo richiama se stesso generando una sequenza di chiamate che ha termine al verificarsi di
una condizione particolare che viene chiamata condizione di terminazione, che in genere si ha con
particolari valori di input.

Esempio: Calcolo del fattoriale n! (si ricorda che 0!=1, 1!=1 e n! = n *(n-1)*(n-2)*..*2*1).

FATT(5)

5 * FATT(4)

n=1
5 * 4 * FATT(3)

5 * 4 * 3 * FATT(2)

5 * 4 * 3 * 2 * FATT(1)

5 * 4 * 3 * 2 *1
NB: Ogni algoritmo ricorsivo pu essere convertito in un algoritmo iterativo.
Vettori (segue)

Ciascuno scomparto si dice componente o elemento del


vettore.
Ciascuno scomparto individuato per mezzo del nome del vettore seguito,
racchiuso tra parentesi (tonde o quadre), dal numero che individua lo scomparto.
Il numero tra parentesi lindice dell'elemento.
La dimensione di un vettore il numero dei suoi elementi.
Nel nostro esempio, la dimensione del vettore v 4 e gli elementi sono individuati
v(l), v(2), v(3), v(4).
Ogni volta che un vettore usato in un algoritmo necessario dichiararne le
caratteristiche nell'elenco delle variabili usate.

I vettori sono particolarmente utili quando necessario effettuare lo stesso tipo


di operazionisu un insieme di dati.
Ve t t o ri (se gu e)

allora il vettore s o m m a e dato d a


(somma per posizione a(1)+b(1),
a(2)+b(2) etc )
Vettori

i <- i+1
Esercizio 1
Calcolare l a somma delle prime n potenze del 2 senza usare la formula:

Esercizio 2
Riscrivere lalgoritmo per il calcolo
del fattoriale esposto a fianco
utilizzando la tecnica del decremento
del contatore.
Esercizio 3
Scrivere un algoritmo che legge dei valori positivi in input fino allinserimento di un
valore minore o uguale a zero e li restituisce in ordine inverso (suggerimento: utilizzare i
vettori).

Esercizio 4 (compito del 31/01/2014)

Esercizio 5 (compito del 17/02/2014)


Formalizzare lalgoritmo, attraverso diagramma a
blocchi o pseudocodifica, per risolvere i
problemi:Siano dati in input due vettori di interi, a e
b, di dimensione n (in input). Si calcoli la somma
incrociata degli elementi a(1)+b(n), a(2)+b(n1),
etc., la si memorizzi nel vettore c, e lo si stampi.

Siano dati in input un vettore v1 di interi (di


dimensione n, in input) ed un intero k. Si determini
lelemento di v1 pi prossimo a k, e lo si stampi
assieme allindice corrispondente.
Esercizio 6 (compito del 07/07/2014)

Esercizi sulle numerazioni binarie (da compiti passati)