Sei sulla pagina 1di 24

Introduzione-agli-Algoritmi

Marzio-Pennisi

Argomenti trattati
A l g o r i t m i ; - - P r o p r i e t --d e g l i - A l g o r i t m i ; Descrizione; C o s t a n t i --e - V a r i a b i l i -

P r o p o s i z i o n i - e --P r e d i c a t i ; ---

D i a g r a m m i --a - b l o c c h i ; -

S c h e m i --f o n d a m e n t a l i --d i C o m p o s i z i o n e ; ---

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
dati che caratterizzano il particolare problema da risolvere.

nell'algoritmo

!
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 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

sui

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+DATI

PROGRAMMA+DATI

ESECUZIONE)DA)PARTE)
DELLUOMO)+)
MACCHINA)CALCOLATRICE)
RISULTATO

ESECUZIONE)DA)PARTE)
DELLELABORATORE)

RISULTATO

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

problema

ANALISI

algoritmo

PROGRAMMAZIONE
Schema)per)la)soluzione)
di)problemi)gi)risolti)
con)nuovi)dati

programma
dati-+-elaboratore
ELABORAZIONE

risultato

Primi esempi di algoritmo


Esempio: Ordinamento di un mazzo d i 4 0 carte

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

ordinare il mazzo di carte in modo che le cuori siano poste per prime,
seguite dalle quadri, dalle fiori e dalle 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 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 "Calcolare =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

!
!

6
b

dopo loperazione di assegnazione a b + c


6

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 com 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)

inizio dellalgoritmo;

Istruzione di inizio esecuzione

Introdurre i valori di a, b e c;

Istruzione di input

Calcolare b 2 - 4ac ; Istruzione operativa


Istruzione di salto
Se > 0 porre x1 [-b + () ] /2a e x2 [-b - () ] /2a e poi passare allistruzione 7 ;

Istruzione di salto
Istruzioni
Se = 0 porre x1 x2 -b /2a e poi passare allistruzione 7 ;
di
controllo
Istruzione di salto

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

Restituire x1 e x2;

Istruzione di output

Fine dellalgoritmo.

Istruzione di fine esecuzione

Proposizioni e predicati
Una proposizione un costrutto
se vero o falso. Ad esempio:

linguistico del quale si pu

dire

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:
diverso
= uguale
> 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 OR q

vero

vero

vero

vero

vero

vero

falso
falso
falso

vero
falso
falso

falso
vero
falso

vero
vero
falso

vero
falso
falso

falso
vero
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)

Metodologia di 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 re 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

A
Blocco)operativo

LEGGI-A
Blocco)di)I/O)(lettura)

falso

vero

Blocco)di)controllo

SCRIVI-A
Blocco)di)I/O)(scrittura)

Flowcharts (segue)
Esempio: Diagramma
M . C . D . (a,b)

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

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
assegnazioni

di

avrebbe

come

effetto

Flowcharts: calcolo (segue)

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.

Schema di sequenza
Mette in evidenza la composizione di n schemi di
uno dopo l'altro. Graficamente appare come:

flusso che devono essere eseguiti

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 essenzialmente uno schema di iterazione (chiuso).

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)
5-*-4-*-FATT(3)

n=1

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.

Ve t t o r i

Una variabile come quelle considerate finora detta anche scalare.


Un vettore (variabile con indice, variabile indicizzata, array) una
coppia <nome, insieme di valori> e pu essere immaginata come
una scatola che ha un nome e che divisa in scomparti; ciascuno
scomparto pu contenere un valore ed numerato in modo progressivo
a partire da1. Ad esempio, la seguente scatola

valore

valore

valore
V

variabile

vettore v

valore

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 operazioni su 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