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