Algoritmi
1
Algoritmi.tex: Versione 1.0, aa 2009-2010
Introduzione
La nozione di algoritmo riguarda qualsiasi campo in cui si possano descrivere sequenze di operazioni finalizzate allo svolgimento di un compito. In tal senso una ricetta di cucina è un algoritmo eseguibile da un
cuoco, uno spartito musicale è un algoritmo eseguibile da un musicista.
2
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio: pasta con le sarde
Ingredienti:
300gr. di bucatini, 350gr. di sarde fresche, 200gr. di finocchio
selvatico, 1/2 bustina di zafferano, 30gr. di pinoli, 30gr. di uvetta
sultanina, 4 filetti d’acciuga sottosale, farina, 1/2 cipolla, olio
di oliva, sale.
Preparazione:
Fate lessare in acqua leggermente salata il finocchio selvatico. Dopo
10 minuti scolatelo e tritatelo. In un tegame fate rosolare, a fuoco
dolce, la cipolla tritata con due cucchiai di olio e le acciughe
diliscate. Unite il finocchio tritato, i pinoli e l’uvetta ammollata e
strizzata. Aggiungete lo zafferano e fate cuocere la salsa a fuoco
basso e con il coperchio per 15 minuti. Preparate le sarde: pulitele,
lavatele, asciugatele. Dividetele a metà lasciandole attaccate dalla
parte del dorso, infarinatele e fatele friggere in olio bollente.
Passatele in un piatto con della carta assorbente e salatele
leggermente. Cuocete i bucatini al dente, scolatele e conditele con
metà della salsa. Ungete una pirofila da forno, disponetevi uno strato
di pasta e, sopra questa, uno strato di sarde fritte e qualche
cucchiaiata di salsa. Procedete cosı̀ e terminate mettendo qualche
cucchiaio di salsa. Riscaldate il forno a 200 gradi. Infornate la pasta
per 10 minuti e servite.
3
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio: algoritmo di Euclide per il massimo comun divisore
• Consideriamo il problema del calcolo del massimo comun divisore di
due numeri:
1. Siano x e y due numeri.
2. Calcola il resto della divisione di x e y.
3. Se il resto è diverso da zero, ricomincia
dal passo 2 utilizzando come x il valore
attuale di y e come y il valore del resto,
altrimenti prosegui al passo successivo.
4. Il massimo comun divisore è uguale al valore
attuale di y.
4
Algoritmi.tex: Versione 1.0, aa 2009-2010
Osservazioni (1)
• Chiunque sappia comprendere ed eseguire le operazioni può cucinare
la pasta con le sarde o calcolare il massimo comun divisore.
• L’esecutore può non conoscere quello che l’algoritmo calcola.
• Un algoritmo è un insieme ordinato di passi, istruzioni, eseguibili
e non ambigui, che definiscono la soluzione di un problema.
• Talune istruzioni manipolano le variabili che rappresentano delle
quantità che nell’esecuzione dell’algoritmo possono cambiare valore.
L’algoritmo precedente manipola 3 quantità contenute nelle variabili
x, y, resto.
• I passi che costituiscono un algoritmo devono essere eseguibili:
l’algoritmo deve essere un metodo effettivo.
1. Crea un elenco di tutti i numeri primi.
2. Ordina l’elenco in modo decrescente.
3. Preleva il secondo elemento dall’elenco risultante.
5
Algoritmi.tex: Versione 1.0, aa 2009-2010
Osservazioni (2)
• Ad ogni passo del procedimento di calcolo deve essere possibile applicare al più una istruzione. Non sono quindi ammesse scelte
non deterministiche.
• Non si pone alcun limite al tempo necessario ad eseguire il
calcolo, né allo (spazio di) memoria richiesto, basta che siano
finiti.
• La nozione di algoritmo focalizza l’attenzione sul metodo di soluzione e non sul linguaggio o sul modo utilizzato per descrivere
tale metodo.
• Il linguaggio naturale non è un buon linguaggio per descrivere
algoritmi soprattutto a causa della sua ambiguità.
1. Siano x e y due numeri.
2. Calcola il modulo di x e y.
6
Algoritmi.tex: Versione 1.0, aa 2009-2010
Osservazioni (3)
• É opportuno sottolineare la differenza tra problema, algoritmo che
lo risolve ed esecuzione dell’algoritmo.
• Un problema non specifica la soluzione.
• Lo stesso problema può essere risolto da più algoritmi. Ad esempio, il
problema del massimo comun divisore tra due numeri è risolto anche
dal seguente algoritmo:
1.
2.
3.
4.
5.
Siano x e y due numeri.
Calcola il minimo tra x e y e sia z tale valore.
Se z divide x e y vai al passo 5.
Decrementa z di uno e ricomincia dal passo 3.
Il massimo comun divisore è uguale al valore
attuale di z.
7
Algoritmi.tex: Versione 1.0, aa 2009-2010
Problemi, Algoritmi ed Esecuzione dell’Algoritmo (1)
Problema: stabilire se un dato anno è o meno bisestile
1.
2.
3.
4.
5.
6.
7.
Sia A l’anno di cui si vuole stabilire la bisestilità.
Se A diviso 400 dà resto zero vai al passo 6.
Se A diviso 100 dà resto zero vai al passo 5.
Se A diviso 4 dà resto zero vai al passo 6.
A non è bisestile, vai al passo 7.
A è bisestile.
Fine.
Eseguiamo l’algoritmo per stabilire la bisestilità dell’anno 2001:
1
2
3
4
5
7
A resto
2001 2001 1
2001 1
2001 1
2001 1
2001 1
8
Algoritmi.tex: Versione 1.0, aa 2009-2010
Problemi, Algoritmi ed Esecuzione dell’Algoritmo (2)
• Chi esegue un algoritmo deve sapere in ogni momento qual è il valore
delle variabili;
• come vedremo i calcolatori hanno una memoria in cui conservano il
valore di ogni variabile;
• quando un algoritmo viene eseguito da un esecutore umano piuttosto
che mandare a mente il valore delle variabili si usa una tabella, detta
trace table, la quale ha tante colonne quante sono le variabili
dell’algoritmo.
• dopo avere eseguito una istruzione si riporta su una nuova riga della
trace table il valore di tutte le variabili.
• è buona norma introdurre nella trace table una colonna in cui si
scrive il numero d’ordine dell’istruzione che e’ stata eseguita.
Esercizio: eseguite l’algoritmo del lucido precedente con A=1996
compilando passo dopo passo la trace table.
9
Algoritmi.tex: Versione 1.0, aa 2009-2010
Problemi, Algoritmi ed Esecuzione dell’Algoritmo (3)
Consideriamo l’algoritmo a pagina 8
• Le istruzioni nelle righe tra 3 e 5 non sono eseguite se si verifica la
condizione specificata in riga 2;
• analogamente le istruzioni nelle righe 4 e 5 non sono eseguite se
eseguendo l’istruzione in riga 3 la condizione specificata risulta vera;
• questo significa che il costrutto linguistico SE usato nell’algoritmo consente di selezionare le istuzioni da eseguire e la selezione
avviene in base al verificarsi di una condizione;
• si osservi che abbiamo l’assunzione implicita che le istruzioni si debbano eseguire una dopo l’altra a meno che un costrutto linguistico
non alteri tale flusso di esecuzione.
10
Algoritmi.tex: Versione 1.0, aa 2009-2010
Problemi, Algoritmi ed Esecuzione dell’Algoritmo (4)
Problema: dato un numero N, intero e maggiore di uno, calcolare tutti
i suoi divisori.
1.
2.
3.
4.
5.
6.
7.
Sia N il numero di cui si vogliono calcolare i divisori.
Poni I uguale a 1.
Se N diviso I dà resto zero, allora I è un divisore di N.
Incrementa I di uno.
Se I*2 minore o uguale a N allora vai al passo 3.
N è un divisore di N;
Fine.
Eseguiamo l’algoritmo per calcolare i divisori di 6
1
2
3
4
5
3
4
N
6
6
6
6
6
6
6
I
1
1 (il resto di N/I è zero)
2
2
(I*2 ≤ N)
2 (il resto di N/I è zero)
3
5
3
4
5
6
7
11
N
6
6
6
6
6
6
I
3
(I*2≤ N)
3 (il resto di N/I è zero)
4
4
(I*2 > N)
4
4
Algoritmi.tex: Versione 1.0, aa 2009-2010
Minimo di 3 Numeri
Calcolare il minimo di 3 numeri
1. Siano A, B,C i 3 numeri;
2. se A<B allora poni MIN=A altrimenti poni MIN=B;
3. se C<MIN allora poni MIN=C;
4. MIN contiene il minimo
o equivalentemente
1.
2.
3.
3.
4.
Siano A, B,C i 3 numeri;
poni MIN=A
se MIN >B allora poni Min=B;
se C<MIN allora poni MIN=C;
MIN contiene il minimo
12
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esercizio: Il Problema del Vinaio
Un produttore di vino applica le seguenti tariffe:
• acquisti fino a 10 bottiglie: 5 euro l’una;
• acquisti fino a 100 bottiglie: alle prime 10 si applica la tariffa del
punto precedente, le restanti vengono vendute a 3 euro l’una;
• acquisti fino a 200 bottiglie: alle prime 100 si applica la tariffa del
punto precedente, le restanti vengono vendute a 2 euro l’una;
• acquisti oltre le 200 bottiglie: alle prime 200 si applica la tariffa del
punto precedente, le restanti vengono vendute a 1 euro l’una.
Descrivere un algoritmo che dato il numero di bottiglie ne calcoli il
costo.
13
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esercizio: Il Problema del Cassiere
Descrivere un algoritmo che data una cifra espressa in euro, calcoli
per ogni banconota e moneta il numero di pezzi che occorrono per
formarla, tenendo conto che il numero di pezzi totale deve essere
minimo. Ad esempio il numero minimo di pezzi per formare la cifra
979,48 é: 1 da 500, 2 da 200, 1 da 50, 1 da 20, 1 da 5, 2 da 2, 2
da 20cents, 1 da 5 cents, 1 da 2 cents, 1 da 1 cents.
14
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo degli Interessi
Per un buono postale di V euro viene dato un interesse annuo del 3%.
Calcolare il valore del buono dopo 5 anni.
1. Sia V il valore del buono;
2. Poni in B il valore dell’espressione aritmetica
V+V*0,03; (poni B=V+V*0,03)
3. poni C=B+B*0,03;
4. poni D=C+C*0,03;
5. poni E=D+D*0,03;
6. poni F=E+E*0,03;
7. il valore del buono dopo 5 anni è F.
Questa soluzione è corretta. Si osservi però che lo stesso schema di operazione è ripetuta 5 volte. Se il problema avesse chiesto di calcolare il
valore del buono dopo 50 anni seguendo questo schema avremmo scritto un algoritmo lunghissimo. Inoltre, prendiamo il seguente problema
più generale:
15
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo degli Interessi
Dato il valore V di un buono postale e l’interesse annuo I, calcolare il
valore del buono dopo X anni.
1. Siano V il valore del buono, I l’interesse e
X il numero di anni;
2. poni K=V;
3. poni K=K+K*I;
4. decrementa X di 1; nota: equivale a scrivere X=X-1;
5. se X>0 vai al passo 3;
6. K contiene il valore del buono
o equivalentemente
1. Siano V il valore del buono, I l’interesse e
X il numero di anni;
2. poni K=V;
3. per X volte ripeti quanto segue:
3.1.
poni K=K+K*I;
5. K contiene il valore del buono
16
Algoritmi.tex: Versione 1.0, aa 2009-2010
Alcuni Commenti (1)
Consideriamo l’algoritmo a pagina 11:
• le istruzioni tra le righe 3-5 vengono ripetute piú volte, fintanto che
é vera la condizione del SE in linea 5.
• lo schema linguistico composto da un SE con un salto ad una
istruzione precedente consente di ripetere piú volte delle istruzioni,
alterando cosı́ l’esecuzione dall’alto verso il basso delle istruzioni;
• tale schema é presente anche a pagina 16;
• tale schema é cosı́ naturale che possiamo introdurre direttamente un
costrutto linguistico che esprima tale schema, ad esempio:
Per ... volte ripeti quanto segue:, come fatto a pagina 16;
17
Algoritmi.tex: Versione 1.0, aa 2009-2010
Alcuni Commenti (2)
• Un algoritmo è caratterizzato da un insieme di istruzioni che
permettono di risolvere un problema;
• ha dei dati in ingresso;
• produce risultati in uscita;
• le istruzioni vengono eseguite una dietro l’altra a partire dalla prima;
• talvolta questa sequenza può essere alterata da due costrutti
linguistici:
– Selezione, che vincola l’esecuzione di un gruppo di istruzioni alla
verità di una condizione
– Iterazione, che mentre una condizione è vera ripete l’esecuzione
di un gruppo di istruzioni.
18
Algoritmi.tex: Versione 1.0, aa 2009-2010
Alcuni Commenti (3)
• Si osservi che nella pratica comune noi eseguiamo le operazioni una
dopo l’altra. Talvolta una o più azioni devono essere eseguite solo in
determinate circostanze (selezione) oppure una o più azioni devono
essere eseguite un certo numero di volte (iterazione). Ad esempio:
• durante una telefonata ad un numero verde potremo sentire: “...se
volete prenotare un posto per un volo nazionale premete il tasto 1
ed attendete che l’operatore vi risponda, se volete sapere il vostro
punteggio 1000 miglia premete 2, attendete il beep poi inserite il
vostro pin,...”;
• una prescrizione medica potrebbe riportare “...fino a quando permane lo stato influenzale assumere 1 pastiglia, 1 cucchiaio di sciroppo
e bere un bicchiere di acqua e zucchero ogni 8 ore...”.
19
Algoritmi.tex: Versione 1.0, aa 2009-2010
Alcuni Commenti (4)
Un algoritmo può essere descritto a diversi livelli di dettaglio, a seconda
del destinatario.
Scrivere un programma per stabilire se un numero n ∈ N è primo.
1. Sia N il numero da testare;
2. se esiste un intero i t.c. 2<=i<=N-1 ed il resto della
divisione tra N e i è 0 allora N NON è primo,
altrimenti lo è;
Equivalentemente possiamo scrivere
1. Sia N il numero da testare;
2. poni i=2;
3. se N e’ uguale a 2 vai al passo 7;
4. se il resto della divisione tra N e i è 0,
N NON è primo, FINE
5. incrementa i di 1;
6. se i<N vai al passo 3.
7. N e’ primo.
20
Algoritmi.tex: Versione 1.0, aa 2009-2010
Alcuni Commenti (5)
• Nel seguito cercheremo di esprimere gli algoritmi seguendo il secondo
stile;
• cercheremo quindi di usare uno stile di descrizione in cui in ogni riga
il comando porti a modificare al massimo il valore di una variabile;
• detto in termini simili, in ogni riga metteremo o un comando che
modifica il valore di una variabile o un comando che modifica il
flusso di esecuzione del programma;
• l’algoritmo di Euclide per il MCD dato a pagina 4 non rispetta questo
stile. Riscriviamolo.
21
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo del Fattoriale
Scrivere un algoritmo che dato un numero n ∈ N, ne calcoli il fattoriale.
1. sia n il numero di cui si vuole calcolare
il fattoriale;
2. poni ris=1;
3. se n<2 allora vai al passo 7;
4. poni ris=ris*n;
5. poni n=n-1;
6. vai al passo 3;
7. ris contiene il valore n!.
22
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo della Retta dei Minimi Quadrati
• Supponiamo che dati i punti (x1, y1), . . . , (xn, yn) vogliamo determinare la retta y = C0 + C1x che minimizza la distanza dai punti
dati.
• I coefficienti C0 e C1 possono essere determinati come segue:
n
n
n
n
X
X
X
X
yi
x2i −
xi
xi y i
C0 =
i=1
n
i=1
n
X
i=1
n
X
x2i − (
i=1
n
C1 =
n
X
xi ) 2
i=1
xi y i −
i=1
n
i=1
n
X
xi
i=1
n
X
x2i − (
i=1
n
X
n
X
yi
i=1
xi ) 2
i=1
23
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo della Retta dei Minimi Quadrati (2)
• Le due formule costituiscono un algoritmo utilizzabile da chiunque
conosca
il linguaggio matematico ed in particolare il significato di
P
.
• l’algoritmo puó essere riscritto in linguaggio naturale:
24
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo della Retta dei Minimi Quadrati (3)
1.Siano (x1, y1), . . . , (xn, yn) i punti di cui si vuole calcolare la retta
dei minimi quadrati;
2.poni Y=0;
3.poni X=0;
4.poni XY=0;
5.poni YQ=0;
6.poni XQ=0;
7.poi i=1;
8.se i ≤ n vai al passo 9, altrimenti vai al passo 16;
9.poni Y=Y+yi;
10.poni X=X+xi;
11.poni XQ=XQ+xi ·xi;
12.poni YQ=YQ+yi ·yi;
13.poni XY=XY+xi ·yi;
14.incrementa i di 1;
15.vai al passo 8;
25
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo della Retta dei Minimi Quadrati (3)
16.poni C0=(Y·XQ-X·XY)/(n·XQ-X·X);
17.poni C1=(n·XY-X·Y)/(n·XQ-X·X);
18.C0 e C1 sono i coefficienti della retta dei minimi quadrati.
26
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo della Media Mobile a 3 Termini
Scrivere un algoritmo che dati n numeri a1, . . . , an, calcoli la media
mobile a 3 termini.
1. Sia a1, a2, ..., an la sequenza di n numeri;
2. poni i a 1;
3.
poni yi a ai + ai+1 + ai+2
4.
poni yi a yi/3
5.
incrementa i di 1;
6. se i ≤ n − 2 vai al passo 3;
7. y1, . . . , yn−2 é la sequenza risultante.
Equivalentemente possiamo descrivere l’algoritmo come
1. Sia a1, a2, ..., an la sequenza di n numeri;
2. per i che varia tra 1 e n-2 ripeti quanto segue:
2.1.
poni yi = ai + ai+1 + ai+2
2.2
poni yi = yi/3
3. y1, . . . , yn−2 é la sequenza risultante.
27
Algoritmi.tex: Versione 1.0, aa 2009-2010
Ancora sull’iterazione
• Gli algoritmi a pagina 24, 22 e il primo algoritmo a pagina 27 hanno
uno schema di iterazione tra le righe 3-6;
• Il secondo algoritmo a pagina 27 introduce espressamente un
costrutto linguistico per tale iterazione:
per ... che varia tra ... e ... ripeti quanto segue
28
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esercizi
• Scrivere un algoritmo che dati due numeri a e b calcoli la soluzione
dell’equazione ax + b = 0;
• scrivere un algoritmo che dati tre numeri a, b e c calcoli la soluzione
dell’equazione ax2 + bx + c = 0, tenendo conto che l’esecutore non
sa calcolare la radice quadrata di numeri negativi;
• scrivere un algoritmo che sommi due interi a e b nell’ipotesi che
l’esecutore sappia fare solo incrementi e decrementi di una unità;
• scrivere un algoritmo che dato un intero N calcoli la somma dei
primi N numeri dispari;
• scrivere un algoritmo che dati n numeri a1, . . . , an, calcoli la media
mobile a 5 termini.
29
Algoritmi.tex: Versione 1.0, aa 2009-2010
Alcuni Commenti
Le istruzioni (o comandi) sono eseguite nell’ordine in cui compaiono,
cioé in sequenza, una dopo l’altra. Tale ordine puó essere alterato
da:
• un costrutto (o comando o istruzione) di selezione, che implementa il costrutto linguistico SE. Tale costrutto consente di scegliere
se eseguire un gruppo di istruzioni o un altro in base al verificarsi di
una condizione;
• un costrutto (o comando o istruzione) di iterazione che implementa
il costrutto linguistico italiano finché o mentre. Tale costrutto
consente di ripetere istruzioni fintanto che una condizione permane
vera.
30
Algoritmi.tex: Versione 1.0, aa 2009-2010
Costrutti per descrivere un algoritmo
Vogliamo fissare un linguaggio per descrivere algoritmi. In particolare
• fisseremo i comandi per specificare la selezione e l’iterazione di
istruzioni;
• se non altrimenti specificato daremo per scontato che le istruzioni
vengano eseguite dall’alto verso il basso a partire dalla prima;
• ci riterremo liberi di descrivere gli algoritmi con un livello di dettaglio
che dipende dalla sofisticazione dell’esecutore a cui é destinato (si veda pagina 20 come esempio) ma i comandi per decrivere selezione
e iterazione saranno sempre gli stessi.
31
Algoritmi.tex: Versione 1.0, aa 2009-2010
Selezione
• Schema (sintassi):
SE condizione
ALLORA
blocco1
ALTRIMENTI
blocco2
FINESE
• Esecuzione (semantica):
– Viene valutata condizione:
∗ se risulta vera, vengono eseguite le istruzioni del blocco1
∗ se risulta falsa, vengono eseguite quelle del blocco2
– L’esecuzione procede con l’istruzione che segue immediatamente
la fine del costrutto di selezione (FINESE)
32
Algoritmi.tex: Versione 1.0, aa 2009-2010
Selezione
• Nel caso in cui il blocco2 non contenga alcuna istruzione, si può
utilizzare il seguente schema semplificato:
SE condizione
ALLORA
blocco1
FINESE
• Esecuzione (semantica):
– Viene valutata condizione:
∗ se risulta vera, vengono eseguite le istruzioni del blocco1, quindi
l’esecuzione prosegue direttamente dalla prima istruzione che
segue il costrutto di selezione
∗ se risulta falsa, l’esecuzione prosegue direttamente dalla prima
istruzione che segue il costrutto di selezione
33
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio
Calcolo della divisione tra due numeri controllando che il divisore sia
diverso da zero:
siano dividendo e divisore i dati di input
SE divisore e’ diverso da zero
ALLORA
il quoziente e’ dividendo/divisore
ALTRIMENTI
la divisione non si puo’ fare
FINESE
34
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio: calcolo delle radici di ax2 + bx + c = 0
siano a, b, c i coefficienti dell’equazione;
calcola il discriminante;
SE il discriminante è minore di zero
ALLORA
l’equazione
√
√ ha due radici complesse:
−b−i
|b2 −4ac|
,
2a
−b+i
|b2 −4ac|
,
2a
l’altra è
una è
ALTRIMENTI
SE il discriminante è uguale a zero
ALLORA
−b
2a sono le due radici reali e coincidenti dell’equazione;
ALTRIMENTI
l’equazione
ha due soluzioni √
reali e distinte:
√
2
2
una è −b− 2ab −4ac , l’altra è −b+ 2ab −4ac ;
FINESE
FINESE
35
Algoritmi.tex: Versione 1.0, aa 2009-2010
Iterazione (schema 1)
• Schema (sintassi):
ESEGUI
blocco
QUANDO condizione
• Esecuzione (semantica):
– Anzitutto viene eseguito il blocco di istruzioni. Quindi si valuta la
condizione:
∗ se risulta vera, si ripete eseguendo nuovamente il blocco e
valutando ancora la condizione
∗ se risulta falsa, si prosegue con l’istruzione scritta dopo il
costrutto iterativo
• Osservazioni
– il blocco é eseguito almeno una volta
– l’esecuzione del costrutto iterativo termina quando la condizione
diventa falsa.
36
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio: somma dei primi n numeri interi
Pn
Senza utilizzare la formula di Gauss ( i=1 i = n(n+1)
2 ), scrivere un
algoritmo che dato un numero intero n, permetta di stabilire la somma
dei primi n numeri interi (1 + 2 + · · · + n).
Calcolo iterativo:
sia n il dato dato di input;
poni il valore di somma a zero;
poni il valore di i a 1;
ESEGUI
poni somma=somma+i;
incrementa i di 1;
QUANDO i≤ n ;
somma contiene il totale.
37
Algoritmi.tex: Versione 1.0, aa 2009-2010
Nota All’Esempio Precedente
L’algoritmo descritto precedentemente non fornisce la risposta corretta
se n ≤ 0. Infatti per definizione la sommatoria vale 0 ma l’algortimo
vale 1. Modificare l’algoritmo perchè fornisca la risposta corretta per
tutti i possibili valori interi di n, cioè anche nel caso di n ≤ 0.
38
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esercizi
Scrivere un Algoritmo che dato un valore intero n calcoli il valore di


2
n
i +2
X
X
j 

i+2
2
i=1
j=i
Scrivere un Algortimo che dato un valore intero n calcoli il valore di
 


2
n
i +i
3∗i
X
X
X
j
j + 2 
·

i+2
i
2
i=1
j=i
j=i
Scrivere un Algortimo che dato un valore intero n calcoli il valore di


i j
n
2
X X
j



i+2
j=1
i=1
39
Algoritmi.tex: Versione 1.0, aa 2009-2010
Iterazione (schema 2)
• Schema (sintassi):
QUANDO condizione ESEGUI
blocco
RIPETI
• Esecuzione (semantica):
– Prima di tutto viene valutata la condizione:
∗ se risulta vera, allora si esegue il blocco e si valuta nuovamente
la condizione.
∗ se risulta falsa, si passa a eseguire l’istruzione che segue il
costrutto iterativo, cioé l’istruzione che segue la parola RIPETI.
• Osservazioni
– il blocco può essere eseguito anche zero volte
– l’esecuzione del costrutto iterativo termina quando la condizione
diventa falsa.
40
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esercizio
Tradurre il seguente algoritmo per il MCD usando il linguaggio
introdotto nei lucidi precedenti.
1. Siano x e y due numeri.
2. Calcola il minimo tra x e y e sia z tale valore.
3. Se z divide x e y vai al passo 5.
4. Decrementa z di uno e ricomincia dal passo 3.
5. Il massimo comun divisore è uguale al valore
attuale di z.
41
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esercizio
Tradurre L’algoritmo di Euclide
1. Siano x e y due numeri.
2. Calcola il resto della divisione di x e y.
3. Se il resto è diverso da zero, ricomincia
dal passo 2 utilizzando come x il valore
attuale di y e come y il valore del resto,
altrimenti prosegui al passo successivo.
4. Il massimo comun divisore è uguale al valore
attuale di y.
nel linguaggio introdotto nei lucidi precedenti;
42
Algoritmi.tex: Versione 1.0, aa 2009-2010
Simulazione
Il comportamento dello schema QUANDO...RIPETI può essere simulato combinando lo schema della selezione con lo schema
ESEGUI...QUANDO..., come segue:
SE condizione
ALLORA
ESEGUI
blocco
QUANDO condizione
FINESE
43
Algoritmi.tex: Versione 1.0, aa 2009-2010
Programmazione strutturata
• Metodologia introdotta agli inizi degli anni settanta.
• L’esecutore é guidato alla sequenza di esecuzione opportuna, tra
tutte quelle possibili, mediante tre strutture di controllo
fondamentali:
– sequenza
permette di eseguire le istruzioni secondo l’ordine in cui sono
scritte
– selezione
permette di scegliere l’esecuzione di un blocco di istruzioni tra due
possibili in base al valore di una condizione
– iterazione
permette di ripetere l’esecuzione di una o più istruzioni in base al
valore di una condizione.
44
Algoritmi.tex: Versione 1.0, aa 2009-2010
Programmazione strutturata
• Tutti gli algoritmi esprimibili tramite le tre strutture di controllo
fondamentali.
• L’impiego di queste strutture migliora la leggibilità dei programmi
prodotti:
– ogni struttura di controllo ha un solo punto di ingresso e un
solo punto d’uscita
– il flusso di esecuzione é evidente dalla struttura del codice
45
Algoritmi.tex: Versione 1.0, aa 2009-2010
Verso un Linguaggio di Programmazione
• A pagina 5 abbiamo osservato che gli algoritmi manipolano variabili, quantitá che possono variare da un’esecuzione all’altra o
all’interno della medesima esecuzione dell’algoritmo;
• l’insieme dei possibili valori che una variabile puó assumere
costituisce il suo dominio;
• il dominio delle variabili, puó essere l’insieme N, l’insieme R, l’insieme C, l’insieme delle matrici, l’insieme delle matrici quadrate,
l’insieme delle lettere dell’alfabeto inglese, etc.
• nell’ambito dei linguaggi di programmazione, il termine usato non é
dominio (di una variabile) ma tipo (di una variabile) e tale sará
il termine che useremo da adesso in poi.
46
Algoritmi.tex: Versione 1.0, aa 2009-2010
Verso un Linguaggio di Programmazione
• In base al tipo certe operazioni matematiche sono o meno possibili:
l’operazione di trasposizione é definita sulle matrici ma non sugli
interi;
• il dominio di una variabile dipende dal problema che si deve risolvere:
a pagina 11 le variabili N e I sono di dominio N \ {0}, per calcolare
la retta dei minimi quadrati le quantitá xi, yi, C0, C1 ∈ R, le variabili
che contengono le radici di un’equazione di secondo grado sono di
dominio C.
47
Algoritmi.tex: Versione 1.0, aa 2009-2010
Verso un Linguaggio di Programmazione
• Molti linguaggi di programmazione quali C, Java, Pascal,..., richiedono di specificare prima dell’inizio delle istruzioni l’elenco delle variabili
e per ciascuna il tipo;
• i linguaggi di programmazione mettono a disposizione solo pochi
tipi predefiniti, fondamentalmente gli insiemi Z, R le le relative
operazioni aritmetiche;
• quando un algoritmo deve trattare quantitá di un tipo non predefinito, ad esempio C, sará compito del programmatore trattare tale
quantitá basandosi sui tipi predefiniti offerti dal linguaggio;
• in questa fase ci interessa specificare espressamente il tipo di tutte
le variabili che compaiono negli algoritmi.
48
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio: somma dei primi n numeri interi
Riscriviamo l’algoritmo dato precedentemente
problema:
Pn per iln(n+1)
senza utilizzare la formula di Gauss ( i=1 i = 2 ), scrivere un
algoritmo che dato un numero intero n, permetta di stabilire la somma
dei primi n numeri interi (1 + 2 + · · · + n)
variabili: n, somma, i di tipo intero;
sia n il dato dato di input;
poni il valore di somma a zero;
poni il valore di i a 1;
ESEGUI
poni somma=somma+i;
incrementa i di 1;
QUANDO i≤ n ;
somma contiene il totale.
49
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio: calcolo delle radici di ax2 + bx + c = 0
Riscriviamo l’algoritmo per il calcolo delle radici di secondo grado.
variabili:
a, b, c, discriminante di tipo reale;
siano a, b, c i coefficienti dell’equazione;
sia discriminante uguale a b2 − 4ac;
SE discriminante è minore di zero
ALLORA
l’equazione
√
√ ha due radici complesse:
−b−i
|b2 −4ac|
−b+i
|b2 −4ac|
, l’altra è
,
una è
2a
2a
ALTRIMENTI
SE discriminante è uguale a zero
ALLORA
−b
2a sono le due radici reali e coincidenti dell’equazione;
ALTRIMENTI
l’equazione
ha due soluzioni reali√ e distinte:
√
, l’altra è −b+ discriminante
;
una è −b− discriminante
2a
2a
FINESE
FINESE
50
Algoritmi.tex: Versione 1.0, aa 2009-2010
Primalitá di un Numero Intero
Prima versione
variabili: n,p,d,r di tipo intero;
sia n il dato di input;
poni p a 1;
poni d a 2;
QUANDO d<n ESEGUI
sia r il resto di n diviso d;
SE r e’ zero
ALLORA p=0
FINESE
d=d+1;
RIPETI
SE p=1
ALLORA n e’ primo
ALTRIMENTI n non e’ primo
FINESE
51
Algoritmi.tex: Versione 1.0, aa 2009-2010
Primalitá di un Numero Intero
Seconda versione:
variabili: n,p,d,r di tipo intero;
sia n il dato di input;
poni p a 1;
poni d a 2;
QUANDO p=1 ESEGUI
sia r il resto di n diviso d;
SE r e’ zero
ALLORA p=0
FINESE
d=d+1;
RIPETI
SE d-1 = n
ALLORA n e’ primo
ALTRIMENTI n non e’ primo
FINESE
52
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo del Coefficiente Binomiale
n
k
Scrivere un algoritmo che dati due numeri n e k calcoli
.
• Il coefficiente binomiale é definito solo per n, k ∈ N e con k ≤ n ed
il risultato é un numero in N;
n
n!
• per risolvere l’algoritmo basta ricordare che k = (n−k)!
k! ;
53
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo del Coefficiente Binomiale
• per risolvere il problema:
n
1. se n < k allora k non é definito, altrimenti facciamo quanto
segue:
2. calcoliamo n! e poniamo tale valore in una variabile, esempio X;
3. calcoliamo (n−k)! e poniamo tale valore in una variabile, esempio
Y;
4. calcoliamo k! e poniamo
tale valore in una variabile, esempio Z;
5. il binomiale di nk é YX·Z .
• questa é giá una descrizione di un algoritmo per un esecutore che
conosca il significato del fattoriale. Nel prossimo lucido lo descriviamo piú in dettaglio usando i costrutti linguistici introdotti
precedentemente
54
Algoritmi.tex: Versione 1.0, aa 2009-2010
Calcolo del Coefficiente Binomiale
variabili: n,k,x,y,z,i di tipo intero;
siano n e k i dati di input;
SE n>=k
ALLORA
poni i=1 e x=1;
QUANDO i<= n ESEGUI
poni x=x*i;
poni i=i+1;
RIPETI
poni i=1 e y=1;
QUANDO i<=(n-k) ESEGUI
poni y=y*i;
poni i=i+1;
RIPETI
poni i=1 e z=1;
QUANDO i<= k ESEGUI
poni z=z*i;
poni i=i+1;
RIPETI
il binomiale e’ x/(y*z)
ALTRIMENTI
il binomiale non e’ definito
FINESE
55
Algoritmi.tex: Versione 1.0, aa 2009-2010
Piano Mutuo
Scrivere un programma che dato il prestito iniziale, la rata e l’interesse
determini il piano di ammortamento del mutuo.
variabili: debito,rata, percentuale di tipo reale, i di tipo
siano debito, rata, percentuale i dati di input;
QUANDO debito >= 0 ESEGUI
il valore di debito e’ quanto resta da restituire;
debito=debito(1+percentuale)-rata
RIPETI
non resta da restituire piu’ nulla.
Esercizio: se la rata e’ troppo bassa il debito aumenta invece di diminuire. Modificare l’algoritmo in modo che calcoli il piano di ammortamento
solo se questo diminuisce.
56
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esercizi
• Scrivere un algoritmo che dati due interi a e b determini il totale della somma dei primi b multipli
di a. Esempio, se a = 5 e b = 4 i primi 4 multipli di 5 sono 5, 10, 15, 20 e la loro somma è 50.
n
n
n
• Scrivere un algoritmo che dato n ∈ N calcoli il valore di 0 + 1 + · · · + n .
P
• Scrivere un algoritmo che dato n ∈ N, calcoli nk=0 k!1 ;
• Scrivere un algoritmo che dato il prestito, l’interesse annuale e la rata mensile, stabilisca il piano
di ammortamento del prestito.
• Scrivere un algoritmo che determini i due numeri piú piccoli di una sequenza di numeri a1, . . . , an
tutti diversi tra di loro;
• Scrivere un algoritmo che dati due numeri h e p determini, usando la nozione di rapporto incrementale, il valore (approssimato) della derivata della funzione trigonometrica sen(x) nell’intervallo
[0, 2π] con passo p (cioé vogliamo calcolare il valore approssimato della derivata di sen(x) nei punti
0, 0 + p, 0 + 2p, 0 + 3p e cosı́ via).
57
Algoritmi.tex: Versione 1.0, aa 2009-2010
Complessità computazionale di un algoritmo: introduzione
Eseguire certi algoritmi sembra più semplice che eseguirne altri ad
esempio:
• dividere due numeri interi è più difficile che sommarli;
• l’algoritmo di Euclide è più veloce di quello presentato
successivamente.
Inoltre il tempo per eseguire un algoritmo dipende dalla lunghezza dei
dati. Ad esempio sommare due numeri interi di 5000 cifre è più lento
che sommare due numeri interi di 5 cifre.
58
Algoritmi.tex: Versione 1.0, aa 2009-2010
Complessità computazionale di un algoritmo (2)
Per valutare la bontà di un algoritmo di solito si considerano due fattori:
• il tempo necessario ad eseguire l’algoritmo;
• lo spazio necessario a contenere i dati per portare a termine
l’esecuzione dell’algoritmo.
Entrambi devono essere valutati in funzione della dimensione dei dati
in ingresso.
59
Algoritmi.tex: Versione 1.0, aa 2009-2010
Esempio
Supponendo di poter disporre di una macchina che esegue un passo
elementare in un microsecondo, ovvero un milione di passi elementari
al secondo si ha:
Complessità
n
n · log2n
n2
n3
2n
n = 10 n = 100 n = 103
n = 106
10µs
0, 1ms
1ms
1s
33, 2µs 0, 6ms
9, 9ms
19, 9s
0, 1ms
10ms
1s
11, 5giorni
1ms
1s
16, 6min ≈ 30000anni
1ms ≈ 1016anni
∞
∞
60
Algoritmi.tex: Versione 1.0, aa 2009-2010