1 ALGORITMI fondamenti di fondamenti di informatica imparare

  • Slides: 75
Download presentation
1 ALGORITMI

1 ALGORITMI

fondamenti di ? fondamenti di informatica: imparare a risolvere problemi di vario genere con

fondamenti di ? fondamenti di informatica: imparare a risolvere problemi di vario genere con le tecniche proprie dell’informatica, e quali problemi sono risolubili. . . cito Aho & Ullman (fondamenti di informatica) : l’informatica e’ la scienza dell’ astrazione ->cioe’ studia come creare il giusto modello per un problema e individuare le tecniche appropriate per risolverlo in modo automatico (con l’aiuto del calcolatore) 2

algoritmi 3 (continua citazione da Aho Ullman): La fisica studia il funzionamento del mondo

algoritmi 3 (continua citazione da Aho Ullman): La fisica studia il funzionamento del mondo reale non cerca di creare un mondo con leggi fisiche piu’semplici o piu’piacevoli o piu’adatte agli interessi del signor Bonchi L' informatica crea astrazioni del mondo reale che possano essere rappresentate e manipolate in un elaboratore. Un modello di macchina per “elaborare dati” o per “eseguire procedure di calcolo” e’ la “macchina” di Turing. La macchina di Turing e' un formalismo per definire procedimenti di calcolo o algoritmi.

4 fondamenti di informatica quindi presenta (oltre alle informazioni di contorno [ambiente HW/SW] )

4 fondamenti di informatica quindi presenta (oltre alle informazioni di contorno [ambiente HW/SW] ) modelli dati, strutture dati, algoritmi (c’e’ un libro di Niklaus Wirth che si chiama appunto “Algoritmi + Strutture Dati = Programmi”) modelli di dati - sia come astrazioni di dati in vari problemi - sia come astrazioni di dati disponibili in un linguaggio di programmazione (Apl, C, Fortran, Java, Oberon, Pascal, . . ) strutture dati: nel caso il modello dei dati del problema da risolvere non ha corrispondenza in uno dei modelli dati del linguaggio usato, allora dovremo rappresentare il modello dati del problema con meccanismi di astrazione presenti nel linguaggio;

5 Per risolvere un problema “generico” con il calcolatore e’ necessario conoscere almeno un

5 Per risolvere un problema “generico” con il calcolatore e’ necessario conoscere almeno un linguaggio in cui scrivere la soluzione del problema [il programma], linguaggio comprensibile al calcolatore, e quindi e’ necessario: * imparare un linguaggio di programmazione (grammatica, vocabolario, significati) in cui scriveremo i nostri programmi * imparare cosa puo’ fare un calcolatore e come lo fa * imparare alcune tecniche di risoluzione di problemi abbastanza semplici, e * imparare a usare queste tecniche per risolvere problemi piu’ complicati. . .

6 In questo corso studieremo UN particolare linguaggio di programmazione come esempio (tra i

6 In questo corso studieremo UN particolare linguaggio di programmazione come esempio (tra i piu' diffusi) per tutti, e studieremo ALCUNI algoritmi risolutivi di semplici problemi di informatica (ad es. ordinamento di dati) e studieremo inoltre alcune nozioni di base importanti per l'informatica (codifica di dati) di seguito viene presentata la nozione di algoritmo

ALGORITMI 7 ALGORITMO = (in 1. a approssimazione) una lista di istruzioni (una ricetta)

ALGORITMI 7 ALGORITMO = (in 1. a approssimazione) una lista di istruzioni (una ricetta) da eseguire (con una macchina o con una persona) per risolvere un problema.

algoritmi segue un esempio. . . ma e' un algoritmo ? 8

algoritmi segue un esempio. . . ma e' un algoritmo ? 8

Praha gulas recipe: 1 kg very lean(magra), nice beef, cubed 9 into about 2

Praha gulas recipe: 1 kg very lean(magra), nice beef, cubed 9 into about 2 cm chunks - 1 kg of yellow onions, chopped, (or less, depending on your tastes) - garlic (you should use at least 5 cloves, finely chopped) - 3 tablespoons of paprika spice, hungarian dark red sweet paprika (one or more) - 1 1/2 teaspoon of whole marjoram - 1 1/2 teaspoon of caraway seeds (kumin) - pepper and salt to taste - water flower (mouka) Cube or chop all you can, in a large pot saute(saltare) onions and garlic untill onions start to be golden and fall apart. Add meat, fry for about 3 minutes (? ). Add salt, pepper, marjoram, caraway seeds and paprika and saute for another 3 minutes. If you want, at this point add Tobasco, tomatoes and bell pepper. Or add only potatoes. If the sauce forms and is too thick, add a bit of water to loosen up. If it is too watery, add a teaspoon of flower mixed with a bit of water to thicken. Repeat until the consistency of the sauce is as desired. Flavour to taste with more of paprika, marjoram, caraway seeds, salt and pepper.

Praha gulas recipe: quantita' descritte con: depending on 10 your tastes oppure one or

Praha gulas recipe: quantita' descritte con: depending on 10 your tastes oppure one or more. . . tipicamente "aggiungere pepe e sale to taste quanto basta" oltre la quantita', anche i tempi sono approssimativi e non deterministici. . . about 3 minutes. le azioni richieste sono spesso non deterministiche se non arbitrarie. . . If you want, at this point add. . . Or add only potatoes. . . Repeat until the consistency of the sauce is as desired. Flavour to taste with more of. . . il risultato NON sara' sempre lo stesso, e anzi dipendera' dall' esecutore. . . == == >> problema delle ricette: contengono istruzioni ambigue una ricetta NON e' un algoritmo

ALGORITMI o procedure di calcolo: note brevi sulla definizione e sui limiti di un

ALGORITMI o procedure di calcolo: note brevi sulla definizione e sui limiti di un processo di calcolo formalizzabile. 11

12 1. o esempio di algoritmo: problema: decidere se a>b ? decidere se a

12 1. o esempio di algoritmo: problema: decidere se a>b ? decidere se a e’piu’ grande di b, con a e b due numeri interi positivi, utilizzando solo operazioni di incremento, decremento, test di eguale a zero e ripetizione.

decidere se a>b ? una soluzione e' data dalla lista di istruzioni seguente: (nota:

decidere se a>b ? una soluzione e' data dalla lista di istruzioni seguente: (nota: qui ogni istruzione ha un' etichetta, da A a F) A test a=0 ? se si’, procedi da E B {se qui, a non zero} test b=0 ? se si’, procedi da F C {se qui, a non zero, b non zero, ora decrementa di uno a e anche b, e poi D ripeti da A; E {qui a=0, b>=0, quindi non e’ a > b} risposta FALSO e STOP F {qui a>0, b=0, quindi e’ a > b } risposta VERO e STOP questa lista di istruzioni e' un ALGORITMO 13

vediamo anche la versione grafica dell'algoritmo per decidere se a>b : a>b? a>b start?

vediamo anche la versione grafica dell'algoritmo per decidere se a>b : a>b? a>b start? A test a=0 ? se si’, procedi da E B {a non zero} test b=0 ? se si’, procedi da F C {qui a non zero, b non zero, ora decrementa a e anche b di 1 e poi D ripeti da A; E {qui a=0, b>=0, quindi non e’ a>b} risposta FALSO e STOP F {qui a>0, b=0, quindi e’ a>b } risposta VERO e STOP questo e' un ALGORITMO 14 A a=0? B b=0? C a <- (a-1) b <- (b-1) a fianco una rappresentazione grafica della stessa procedura, detta "diagramma a blocchi" o "flow-chart" E F vero stop falso stop

vediamo anche la versione grafica dell'algoritmo per decidere se a>b : A test a=0

vediamo anche la versione grafica dell'algoritmo per decidere se a>b : A test a=0 ? se si’, procedi da E B {a non zero} test b=0 ? se si’, procedi da F C {qui a non zero, b non zero, ora decrementa a e anche b di 1 e poi D ripeti da A; E {qui a=0, b>=0, quindi non e’ a>b} risposta FALSO e STOP F {qui a>0, b=0, quindi e’ a>b } risposta VERO e STOP questo e' un ALGORITMO a fianco una rappresentazione grafica della stessa procedura, detta "diagramma a blocchi" o "flow-chart" 15 un esempio di un frammento di programma in C che realizza l'algoritmo a fianco: boolean maggiore ( int a, int b) { while( a>0 && b>0) { a--; b--; } // while if ( a==0) return false; if ( b==0) return true; } // maggiore

osservazione sull’algoritmo per decidere se a>b ? (a e b due numeri interi positivi,

osservazione sull’algoritmo per decidere se a>b ? (a e b due numeri interi positivi, con le sole operazioni di incremento, decremento, test di eguale a zero, ripetizione) 16 che ripetiamo qui (sono sei istruzioni): A test a=0 ? se si’, procedi da E B {a non zero} test b=0 ? se si’, procedi da F C {qui a non zero, b non zero, ora decrementa a e anche b di 1 e poi D ripeti da A; E {qui (a=0, b>=0) quindi non e’ a>b} risposta FALSO e STOP F {qui (a>0, b=0) e quindi e’ a>b } risposta VERO e STOP nota: quante volte sara' eseguita l'istruz C (decrementa) se i dati sono a=3, b=6; e se a=7, b=2 ? a seconda dei dati alcune istruzioni saranno ripetute piu’ volte: il numero delle istruzioni dell’algoritmo (qui 6) in generale NON coincide con il numero delle istruzioni che saranno effettivamente eseguite!

17 proviamo a eseguire l'algoritmo per calcolare la risposta alla domanda a>b ? con

17 proviamo a eseguire l'algoritmo per calcolare la risposta alla domanda a>b ? con valori dati di a e di b, ad es. a vale 3 b vale 6 riportiamo in tabella i valori di a e di b per ogni passo di esecuzione

A test a=0 ? se si’, procedi da E B {a non zero} test

A test a=0 ? se si’, procedi da E B {a non zero} test b=0 ? se si’, procedi da F C {qui a non zero, b non zero, ora decrementa a e anche b di 1 e poi D ripeti da A; E {qui (a=0, b>=0) quindi non e’ a>b} risposta FALSO e STOP F {qui (a>0, b=0) e quindi e’ a>b } risposta VERO e STOP a fianco l'esecuzione per i dati a=3, b=6, seguita passo per passo; l'istruzione C e' eseguita 3 volte (il valore piu'piccolo tra a e b) 18 traccia dell'esecuzione: istruz a b A 3 6 B 3 6 C 2 5 A 2 5 B 2 5 C 1 4 A 1 4 B 1 4 C 0 3 A 0 3 E risposta: valore test a=0? no b=0? no vai a A a=0? no b=0? no vai ad A a=0? si, vai E a>b? e' falso

19 provare a seguire l'esecuzione dell'algoritmo a>b ? con i valori a=7, b=2 A

19 provare a seguire l'esecuzione dell'algoritmo a>b ? con i valori a=7, b=2 A test a=0 ? se si’, procedi da E B {a non zero} test b=0 ? se si’, procedi da F C {qui a non zero, b non zero, ora decrementa a e anche b di 1 e poi D ripeti da A; E {qui (a=0, b>=0) quindi non e’ a>b} risposta FALSO e STOP F {qui (a>0, b=0) e quindi e’ a>b } risposta VERO e STOP

algoritmi: un algoritmo e’ una definizione precisa, completa e non ambigua della sequenza di

algoritmi: un algoritmo e’ una definizione precisa, completa e non ambigua della sequenza di passi da fare -> (cioe' una lista di istruzioni [una ricetta] da eseguire ) -> per risolvere un problema, e ottenere un risultato in un tempo finito passi (o istruzioni) che possono essere meccanicamente eseguiti da un “esecutore” - quindi: la definizione puo' essere fornita in un linguaggio generico purche’ comprensibile al destinatario, persona o macchina, in particolare : un algoritmo scritto in un linguaggio di programmazione comprensibile ad un elaboratore e’ un PROGRAMMA 20

calcolo automatico 21 L' esecuzione di un algoritmo a partire da un insieme di

calcolo automatico 21 L' esecuzione di un algoritmo a partire da un insieme di dati prefissato da' luogo ad una sequenza di passi come specificati dall' algoritmo che portano dai dati iniziali al risultato: l'insieme di questi passi e' un processo di calcolo o un'elaborazione o un calcolo automatico

calcolo automatico? 22 un calcolo automatico e’ composto da: un insieme di dati iniziali

calcolo automatico? 22 un calcolo automatico e’ composto da: un insieme di dati iniziali A un insieme P di "regole" (istruzioni) F che chiameremo programma o algoritmo; ogni regola F trasforma una parte X dei dati in altri dati Y; una "macchina" che e’ in grado di interpretare ed eseguire le regole del programma; l’esecuzione del programma da parte della macchina produce (a partire dai dati iniziali A) ad ogni passo k di esecuzione dei dati intermedi Ik e alla fine produce dei risultati (dati finali) Z : Z = P ( A );

calcolo automatico 23 un calcolo automatico o elaborazione e’: 1) un insieme di dati

calcolo automatico 23 un calcolo automatico o elaborazione e’: 1) un insieme di dati iniziali A, 2) un programma o insieme P di regole F (ogni regola F trasforma [elabora] una parte X dei dati in altri dati Y) 3) un “elaboratore” che applica le F su A ripetutamente; in generale un’ elaborazione e’ una trasformazione Z = P(A) con A = insieme dei dati iniziali, Z = ins. dei dati finali, P = regola che fa corrispondere Z ad A, o funzione

calcolo automatico un’ elaborazione e’ una trasformazione Z = P(A) con A = insieme

calcolo automatico un’ elaborazione e’ una trasformazione Z = P(A) con A = insieme dei dati iniziali, Z = insieme dei dati finali, P = "regola" che fa corrispondere Z ad A, o funzione P e’ una funzione nel senso piu’ lato: una somma di due numeri, la preparazione del bilancio di una societa’, la stampa di un certificato anagrafico, il calcolo della situazione meteorologica di domani, il calcolo del percorso su rete ferroviaria di lunghezza minima tra due citta' in Italia, l’esecuzione di una mossa nel gioco degli scacchi. . . 24

algoritmi: un secondo esempio vediamo ora un secondo esempio di algoritmo somma di due

algoritmi: un secondo esempio vediamo ora un secondo esempio di algoritmo somma di due numeri di n cifre ciascuno, es. : dato uno dato due 1 2 9 3 9 0 1 9 + 25

2. o es. di algoritmo: somma due numeri 26 Il concetto di "fare dei

2. o es. di algoritmo: somma due numeri 26 Il concetto di "fare dei conti" e' abbastanza intuitivo. Alle elementari ci insegnano l'aritmetica, ad esempio l'addizione di numeri di n cifre, con riporto; qui di seguito, il primo passo per la somma di numeri a piu' cifre: 1 9 9 1 2 3 0 9 ------------3 2 9 0 0 1 + dato uno dato due sommando rango per rango: = le cifre di somma in colonna = le cifre di riporto della somma in colonna

2. o es. di algoritmo: somma due numeri somma di numeri a piu' cifre:

2. o es. di algoritmo: somma due numeri somma di numeri a piu' cifre: 1 9 9 2 3 0 ------------3 2 9 0 1 + dato uno dato due sommando rango per rango: = le cifre di somma in colonna = le cifre di riporto della somma in colonna le cifre della somma e del riporto sono date dalle "regole": 1) cifra. S = cifra. A + cifra. B; (rango generico k) 2) se cifra. S > 9 allora cifra. S = cifra. S - 10 e riporto. S vale 1; altrimenti cifra. S rimane e riporto. S vale 0 27

. . . procedimenti di calcolo: addizione di due numeri dopo il primo passo

. . . procedimenti di calcolo: addizione di due numeri dopo il primo passo : 1 9 9 2 3 0 ------------3 2 9 0 1 + = somma di due dati di 4 cifre ciascuno otteniamo le cifre somma in colonna e le cifre riporto secondo passo: se c'e almeno un riporto non nullo allora devo sommare al risultato parziale i riporti, ma spostati di una colonna a sinistra, e ripeto di nuovo somma: 0 0 3 2 9 0 1 0 ------------4 2 0 0 1 0 AA = le somme dei. . . BB = i riporti dei. . . cifre somma in colonna NUOVE cifre riporto 28

. . . procedimenti di calcolo: addizione di due numeri ripetiamo: 1) 1 1)

. . . procedimenti di calcolo: addizione di due numeri ripetiamo: 1) 1 1) 2 9 3 9 0 1 9 29 + primo dato iniziale = secondo dato iniziale ------------------------------------- 2) 2) 0 3 1 2 0 9 1 0 - ------------------------------------- 3) 3) 0 4 0 2 1 0 - (somme) (riporti spostati di una colonna a sinistra). . . ripeto sommando: (nuovi riporti gia’ spostati ------------------------------------- 4) 4 3 0 0 cifre somma in colonna 4) 0 0 cifre riporto (non spostate). . . a questo punto non ripeto piu' perche’ si verifica la situazione di nessun riporto (tutti i riporti nulli)- ottengo: 5) 4 3 0 0 e' la somma. . . e ho finito

. . . procedimenti di calcolo: addizione di due numeri Schema del procedimento visto

. . . procedimenti di calcolo: addizione di due numeri Schema del procedimento visto (o "ricetta") : per fare la somma di due numeri di 4 cifre: date 10 variabili (*) (a, b, c, d, e f, g, h, i, j) con valori iniziali (da 0 a 9) (0, 1, 9, 9, 1, 0, 2, 3, 0, 9) applichiamo ripetutamente la funzione f(X) -> Y f (a, b, c, d, e, f, g, h, i, j) -> (a 1, b 1, c 1, d 1, e 1, f 1, g 1, h 1, i 1, j 1), con a 1 = nuovo valore di a, . . j 1 = nuovo valore di j, { dove a 1, b 1, . . e 1 sono le somme delle cifre: a 1= a+f, b 1=b+g, . . . f 1, g 1, . . j 1 sono i riporti: f 1 =riporto(cifra delle decine)di( b+g) g 1=riporto(c+h), h 1=rip(d+i), i 1=rip(e+j), infine j 1=0 }, fino a che sono nulli tutti i valori dei riporti (f, g, h, i, j). ------------------------------------- (*) variabile: oggetto dotato di nome e di valore; il valore varia durante il procedimento ma e’unico in ogni istante di tempo. 30

ad es. con i dati di prima, AA=1991 e BB=2309 avremo: f(0, 1, 9,

ad es. con i dati di prima, AA=1991 e BB=2309 avremo: f(0, 1, 9, 9, 1, 0, 2, 3, 0, 9) -> (0, 3, 2, 9, 0, 0, 1, 0) poi f(0, 3, 2, 9, 0 , 0, 1, 0) -> (0, 4, 2, 0, 0, 1, 0, 0) poi f(0, 4, 2, 0, 0, 1, 0, 0) -> (0, 4, 3, 0, 0, 0, 0) e basta: 31 ottengo la somma applicando ripetutamente la f alle variabili (cifre) a partire dai valori iniziali dati, fino a che sono nulli i valori di (e, f, g, h, i, j). Il processo di calcolo e' l' insieme delle 10 -tuple dalla prima fino all'ultima: 1) (0, 1, 9, 9, 1, 0, 2, 3, 0, 9) "stato iniziale" 2) (0, 3, 2, 9, 0, 0, 1, 0) "stato intermedio" 3) (0, 4, 2, 0, 0, 1, 0, 0) "stato intermedio" 4) (0, 4, 3, 0, 0, 0, 0) "stato finale" ogni 10 -tupla e' ottenuta dalla precedente applicando la funzione definita prima.

elaborazione o procedimento di calcolo: una definizione dato un insieme K di dati (variabili

elaborazione o procedimento di calcolo: una definizione dato un insieme K di dati (variabili a valore intero = oggetti capaci di asumere un valore intero) data una funzione di trasformazione f(K) = K 1 ( la f trasforma K in un K 1 = insieme delle stesse variabili di K con valori nuovi dato un esecutore M [generico: persona, macchina] di f: quindi f deve essere eseguibile da M, allora: il processo di calcolo e' la sequenza degli insiemi dei dati a partire da K 0 (dato iniziale) K 1, K 2, . . . Kn , con K 1 = f( K 0). . . con Ki+1 = f( Ki). . . e con Kn dato finale (risultato) la sequenza dei dati intermedi deve essere finita: cioe’ tale che esista n (finito) tale che Kn = risultato 32

. . . definizione di algoritmo. . . 33 il concetto di algoritmo e’

. . . definizione di algoritmo. . . 33 il concetto di algoritmo e’ preesistente all’informatica (i primi procedimenti di calcolo risalgono a 3000 anni fa, nella regione babilonese (es: calcolo del volume di una botte, calcolo delle radici di un’ equazione di secondo grado, calcolo dell’interesse composto ecc; ) la parola algoritmo (dal matematico Al Khowarismi, 800 d. c. , Baghdad) indicava fino ad un secolo fa le procedure dell'aritmetica decimale (somme, prodotti, . . . )) e genericamente indicava un procedimento matematico per risolvere un problema; oggi e’ associato al concetto di elaborazione: un algoritmo e’la specifica (finita) di una sequenza finita di azioni elaborative (passi di elaborazione) che risolve automaticamente un problema.

. . . una curiosita’ sulla definizione di algoritmo: 34 Dal dizionario Zingarelli, ed.

. . . una curiosita’ sulla definizione di algoritmo: 34 Dal dizionario Zingarelli, ed. 1959, (comperato dal Centro di Calcolo dell' Universita' di Trieste nel 1963) la parola algoritmo e' riportata ancora con una sua definizione storica: . . algore, m. * ALGOR -ORIS. Freddo grande. | Stagione fredda. +algorismo, -itmo, m. *sp. ALGUARISMO. Cifra arabica (dal matematico arabo Al-Kuarismi che apprese dagl'Indiani l'abbaco e lo insegno' in Spagna(*) circa l' 820). Aritmetica col sistema arabo. | Pratica dell'aritmetica. algoso, v. sotto a l g a. . . (*) no, era a Bagdad !

un’ osservazione sugli algoritmi e su Al-Kuarismi per non sottovalutare i primi algoritmi per

un’ osservazione sugli algoritmi e su Al-Kuarismi per non sottovalutare i primi algoritmi per l’aritmetica con le cifre decimali arabe, basti pensare alla differenza di lavoro, fatica e tempo tra: calcolo con il sistema di numerazione arabo (*) : 17 x 1524 + 44 = ? calcolo con il sistema di scrittura di numeri romano: XVII x MDXXIV + XLIV = ? ----------(*)(per un periodo la Chiesa in Italia vieto' l’ uso delle cifre arabe di provenienza degli infedeli, poi si accetto’ il sistema migliore. . . vedremo un po' di storia dei sistemi di numerazione parlando della codifica dei numeri 35

definizione informale di algoritmo un algoritmo e’ una procedura effettiva di calcolo eseguibile da

definizione informale di algoritmo un algoritmo e’ una procedura effettiva di calcolo eseguibile da un esecutore ovvero e’ una lista finita di istruzioni eseguibili e non ambigue che eseguita a partire da un dato valido (un insieme di dati) produce in un numero finito di passi un risultato; inoltre, eseguendo piu’ volte lo stesso algoritmo sugli stessi dati si ottiene sempre lo stesso risultato N. B. : * lista finita; * istruzioni eseguibili, non ambigue, deterministiche; * il procedimento di elaborazione finito: la sequenza dei dati intermedi e’ finita, ovvero e’ garantito che prima o poi si arriva al risultato 36

algritmo = programma ? 37 un algoritmo e’ una 1) lista finita 2) istruzioni

algritmo = programma ? 37 un algoritmo e’ una 1) lista finita 2) istruzioni eseguibili, non ambigue, deterministiche: se eseguo piu’ volte lo stesso algoritmo sugli stessi dati ottengo sempre lo stesso risultato 3) procedimento di elaborazione finito: la sequenza dei dati intermedi e’ finita: prima o poi arrivo al risultato NOTA: i punti 1 e 2 sono sempre soddisfatti da un programma scritto in un linguaggio di programmazione – il punto 3) invece NON e' sempre rispettato in un programma

algritmo = programma ? 38 un algoritmo e’ una (1) lista finita di (2)

algritmo = programma ? 38 un algoritmo e’ una (1) lista finita di (2) istruzioni eseguibili, non ambigue, deterministiche, che da', a partire da dati validi, sempre luogo a un (3) procedimento di elaborazione finito: NOTA: i punti 1 e 2 sono sempre soddisfatti da un programma scritto in un linguaggio di programmazione (per come sono definiti questi linguaggi), . . . ma: il punto (3) invece NON e' sempre rispettato in un programma esempio banale di programma che non finisce mai: void main(){ do{ printf("salve"); } while ( true ); } // main

39 Analizziamo piu’ a fondo la definizione di algoritmo

39 Analizziamo piu’ a fondo la definizione di algoritmo

ritorniamo alla definizione di procedimento di calcolo • dato un insieme K 0 di

ritorniamo alla definizione di procedimento di calcolo • dato un insieme K 0 di dati • data una funzione di trasformazione f(K) = K 1 • esiste un esecutore M [persona o macchina] di f - f deve essere eseguibile da M ! f definisce un procedimento di calcolo che parte da K 0 (dato iniziale) e attraverso K 1 [con K 1 = f( K 0)], K 2 , K 3. . . Ki dove. . . Ki+1 = f( Ki) arriva a Kn dato finale. con sequenza dei dati intermedi K 0, K 2, . . . Ki, . . . Kn finita: esiste n finito tale che Kn = risultato vediamo ora i singoli punti 40

1) esaminiamo in dettaglio il primo punto: i dati 1) dato un insieme K

1) esaminiamo in dettaglio il primo punto: i dati 1) dato un insieme K 0 di dati ==>> i dati possono essere rappresentati come un insieme di variabili a valore intero = oggetti capaci di asumere un valore intero quindi al posto dei dati (del problema reale) consideriamo un insieme di variabili S = {a, b, c, . . . } a valori interi, che "descrivono lo stato di un sistema", (del problema) ogni insieme di valori S rappresenta un possibile stato e in particolare abbiamo un insieme S(0) ovvero S 0 di valori iniziali delle variabili a, b, c, . . (non solo UN specifico dato iniziale K 0 ) 41

2) : le regole o la funzione di trasformazione 42 2) data una funzione

2) : le regole o la funzione di trasformazione 42 2) data una funzione di trasformazione f(S) = S 1 (S = insieme dei valori delle variabili = stato del calcolo, S 1= insieme delle stesse variabili con valori nuovi)=> la funzione di trasformazione f e’ definita per i valori di S e assume valori in S - scriveremo: f ( S ) -> S, f e' la procedura di calcolo: a partire da una generica situazione Si = stato = insieme dei valori delle variabili al passo i-esimo del procedimento risolutivo la f produce i valori Si+1 = stato = valori delle variabili al passo successivo (i+1)-esimo del procedimento risolutivo parte da S 0, poi f(S 0)= S 1 poi f(S 1)=S 2 poi f(S 2)= S 3 ecc

3) esecutore: 43 . . . data una funzione di trasformazione f(S) = S

3) esecutore: 43 . . . data una funzione di trasformazione f(S) = S 1 [ f e' la procedura di calcolo: da Si = statoi produce Si+1 = statoi+1 (valori delle variabili al passo (i+1)-esimo) quindi: f(S 0) -> S 1; f(f 1)-> S 2 , f(f 2)-> S 3 , f(f 3)-> S 4 , ecc ] ** esiste un esecutore M di f ipotesi importante: tutto il procedimento e’ automatico, eseguibile da una “macchina” (o anche da una persona); ** si richiede che la funzione f sia: * eseguibile (dall’ esecutore: persona o macchina), * deterministica (da S(k) produce sempre lo stesso S(k+1)) * completa (definita per tutti i possib. insiemi S(k) ottenibili dai possibili dati iniziali validi)

finitezza: abbiamo presentato 3 componenti: # insieme S 0 di dati ; # esecutore

finitezza: abbiamo presentato 3 componenti: # insieme S 0 di dati ; # esecutore M # funzione di trasformazione f(S) = S 1 questa terna ( f S 0 M ) definisce la sequenza dei dati intermedi S 0, S 2, . . . Si, . . . Sn-1 , fino a Sn con S 0 [dato iniziale], f( S 0) = S 1, . . . f( Si) = Si+1. . . f( Sn-1)= Sn [dato finale] ipotesi importante sulla durata: la sequenza S 0, S 2, . . . Si, . . . Sn e’ finita: dati ( f, S 0, M ) esiste n finito tale che Sn = risultato ovvero il numero di passi dallo stato iniziale S(1) allo stato finale S(n) deve essere finito 44

soluzione algoritmica di problemi Per risolvere un problema con il calcolatore dobbiamo * specificare

soluzione algoritmica di problemi Per risolvere un problema con il calcolatore dobbiamo * specificare e delimitare il problema * individuare un procedimento risolutivo del problema - cioe' un insieme di regole che, eseguite 45 ordinatamente, permettono di calcolare i risultati del problema a partire dalle informazioni a disposizione = definire un algoritmo (insieme finito di regole, eseguibili da un esecutore ipotetico, non ambigue, cioe' univocamente interpretabili, e finite, nel senso che l'esecuzione dell'algoritmo termini in un tempo finito per ogni insieme di valori dei dati di ingresso)

cont. soluzione algoritmica di problemi abbiamo detto che per risolvere un problema con il

cont. soluzione algoritmica di problemi abbiamo detto che per risolvere un problema con il calcolatore dobbiamo * specificare e delimitare il problema * trovare un procedimento risolutivo (un algoritmo) infine dobbiamo - * individuare una rappresentazione [PROGRAMMA] dell' algoritmo, delle informazioni date e di quelle usate dall'algoritmo [DATI INIZIALI, INTERMEDI e RISULTATI] per mezzo di un linguaggio di programmazione comprensibile sia a noi che al calcolatore 46

ancora due esempi: 3. o algoritmo : calcolo dell’ interesse composto: dato un capitale

ancora due esempi: 3. o algoritmo : calcolo dell’ interesse composto: dato un capitale iniziale (ad es. 1000 ducati d’oro) dato un tasso di interesse (ad es. 40 percento) quanti ducati avro’ tra 8 anni? useremo 4 variabili per definire lo stato dell'elaborazione: (cap, int, num, konta) ovvero (capitale, interesse, numero anni, contatore anno corrente) 47

3. o algoritmo : calcolo dell’ interesse composto: 48 dati i valori iniziali di

3. o algoritmo : calcolo dell’ interesse composto: 48 dati i valori iniziali di S 0 = (cap, int, num, 1) (cap = capitale iniziale [es. 1000] , int = interesse annuo [es. 40%], num = numero anni di deposito [es. 4] ) trovare il procedimento per calcolare il capitale dopo n anni ovvero trovare f tale che dato S 0 produca la sequenza S 0 , S 1 , S 2 , . . . Si , . . . Snum dove Snum = (capnum, intnum, num) = risultato troviamo una f funzione che da quadrupla di valori: (cap, int, num, konta) [konta = varibile ausiliaria, e’ un "contatore" a valori da 1 a n ] produce una quadrupla di valori nuovi: (cap 1, int 1, num 1, konta 1) <= f (cap, int, num, konta)

cont. calcolo dell’ interesse composto: 49 valori iniziali S 0 = (cap, int, num,

cont. calcolo dell’ interesse composto: 49 valori iniziali S 0 = (cap, int, num, 1) (capitale iniziale, interesse annuo, num. anni di deposito, 1) f (cap, int, num, konta) = (cap 1, int 1, num 1, konta 1) una f che definisce il procedimento e’: (c 1, int 1, n 1, k 1) <= f (c, int, n, k) = ( ( c*(100+int) ) /100 , int, n, k+1 ) e per calcolare il capitale dopo n anni si esegue n volte: (1) dato iniz. ( c, i, n, 1 ); (k=1 !) (2) ripeti l’istruz. seguent. (3) fintantoche k<n (3) calcola i valori c 1, i 1, n 1, k 1 dai valori c, i, n, k: (c 1, i 1, n 1, k 1) = f(c, i, n, k) sostituisci ai vecchi valori c, i, n, k questi valori nuovi c 1, i 1, n 1, k 1 e poi ripeti alla fine k=n, c = capitale accumulato dopo n anni.

4) interesse composto: esempio di traccia di esecuzione 50 f (c, i, n, k)

4) interesse composto: esempio di traccia di esecuzione 50 f (c, i, n, k) = ( (c*(100+i))/100, i, n, k+1 ) n. istr. cap. int. n k (prima dell’istr (1) i valori 1 delle var. non sono def !) 3 1000 4 5 1 valori iniziali -> val. nuovi: 4 1040 4 5 2 k<n quindi ripeti da 3 3 1040 4 5 2 val. correnti -> val. nuovi: 4 1082 4 5 3 k<n quindi ripeti da 3 3 1082 4 5 3 val. correnti -> val. nuovi: 4 1125 4 k<n quindi ripeti da 3 3 1125 4 val. correnti -> val. nuovi: 4 1170 4 5 5 k=n -> ho il risultato

4. o ALGORITMO: il massimo comune divisore calcolo del massimo comune divisore dati due

4. o ALGORITMO: il massimo comune divisore calcolo del massimo comune divisore dati due numeri A e B quale e’ il numero intero piu’ grande che e’ divisore sia di A che di B ? es. dati due numeri A = 1996 e B = 768 1996 = 4*499, 768=3*4*64, massimo comun divisore e’ 4 2. o es. per 2310 e 203 che sono rispettivamente 2310=2*3*5*7*11 e 203=7*29 quindi 7 e’ il massimo comun divisore dei due numeri 51

4) algoritmo: calcolo del massimo comune divisore due versioni di soluzione (Batini, Carlucci, e

4) algoritmo: calcolo del massimo comune divisore due versioni di soluzione (Batini, Carlucci, e altri) 4. a) un primo procedimento del calcolo del massimo comune divisore : * dati I e J numeri interi positivi, * calcola SI = l'insieme dei divisori di I * calcola SJ = l'insieme dei divisori di J * calcola l'insieme SK dei divisori comuni a I e J, ovvero SK = l'intersezione degli insiemi SI e SJ * calcola nm = il numero massimo che sta in SK * la soluzione e' nm 52

cont. es. del calcolo del massimo comune divisore 4. b) un secondo procedimento (Euclide):

cont. es. del calcolo del massimo comune divisore 4. b) un secondo procedimento (Euclide): siccome vale la proprieta' seguente: mcd(m, n) = se m=n allora mcd = m oppure mcd=n, se m>n allora = mcd( m-n, n ) se n>m allora = mcd( m, n-m ) * allora per calcolare il m. c. d. si eseguono le istruzioni : (algoritmo di Euclide, 4. o secolo a. C. ) * ripeti le istruz. seguenti finche' m e' diverso da n : * se m> n * allora sostituisci a m il valore di m-n, altrimenti se n>m sostituisci a n il valore di n-m; quando m = n abbiamo finito, e m e’ il m. c. d. cercato 53

1. ) es. del calcolo del massimo comune divisore di x e y Esempio

1. ) es. del calcolo del massimo comune divisore di x e y Esempio di esecuzione dell’algoritmo (qui ripetuto): @ finche' m e' diverso da n si ripetano le azioni: se m> n * allora sostituisci a m il valore di m-n, # altrimenti sostituisci a n il valore di n-m; una "traccia" di esecuzione con dati 18 e 12 (sono usati @, #, * come riferimenti all’algoritmo qui sopra): 1) m = 18, n=12; 2) m>n ? si allora * calcola m-n = 18 -12 = 6 e assegna a m: 3) m = 6, n=12 4) m>n ? no allora # calcola n-m = 12 -6 = 6 e assegna a n 5) m=6, n=6, 6) m=n ? si, allora @ non ripetere piu’, 7) il risultato e’ il valore di m cioe' 6 54

2. ) es. del calcolo del massimo comune divisore di m, n 55 @

2. ) es. del calcolo del massimo comune divisore di m, n 55 @ finche' m e' diverso da n si ripetano le azioni: se m> n * allora sostituisci a m il valore di m-n, # altrimenti sostituisci a n il valore di n-m; 2. ) es. dati A = 1996 e B = 768 0) 1) 2) 3) 4) 5) 6) 7) m 0 = 1996 e n 0 = 768 * m 1=1996 -768=1228, n 1=768; * m 2=1228 -768=460, n 2=768; # m 3=460, n 3=768 -460=308; * m 4=460 -308=152, n 4=308; # m 5=152, n 5=308 -152=156; # m 6=152; n 6=156 -152=4 * m 7=152 -4=148, n 7=4; . . . (ripeto per altre 36 volte) 43) * m 43=8, n 43=4; 44) @ m 44=8 -4=4, n 44=4; m==n => ho finito ! => MCD=4

3. ) es. del calcolo del massimo comune divisore di m, n @ finche'

3. ) es. del calcolo del massimo comune divisore di m, n @ finche' m e' diverso da n si ripetano le azioni: se m> n * allora sostituisci a m il valore di m-n, # altrimenti sostituisci a n il valore di n-m; 3. ) es. dati 2310 e 203 1)m 1=2310, n 1=203; 2)m 2=2107, n 2=203; 3)m 3=1904, n 3=203; 4)m 1=1701, n 4=203; 5)m 5=1498, n 5=203; 6)m 6=1295, n 6=203; 7)m 7=1092. . 8)m 8=889, . . . ; 9)686, . . . ; 10)483, . . ; 11)m 11=280, n 11=203; 12)m 12=77, n 12=203; 13)m 13=77, n 13=126; 14)m 14=77, n 14=49; 15)m 15=28, n 15=49; 16)m 16=28, n 16=21; 17)m 17=7, n 17=21; 18). . 7, . . 14 19)m 19=7, n 19=7 e ho finito. . . ==>> MCD=7 56

traccia di UNA esecuzione: un algoritmo ed un particolare insieme di dati in ingresso

traccia di UNA esecuzione: un algoritmo ed un particolare insieme di dati in ingresso o di partenza definiscono un particolare processo di calcolo come questo visto per il calcolo del MCD di 18 e 12, oppure per i due esempi MCD(1996 , 768)=4 e MCD(2310, 203)=7 oppure come quello visto prima per il calcolo del capitale con interesse composto con capitale iniziale 1000 interesse annuo 40 e numero anni 4, oppure come l’ esempio iniziale di calcolo della somma di due numeri interi a=1991 e b=2309 con s= 4300. . . 57

un algoritmo + un particolare insieme di dati iniziali 58 definiscono un particolare processo

un algoritmo + un particolare insieme di dati iniziali 58 definiscono un particolare processo di calcolo NOTA: dati e algoritmo: un algoritmo puo’ essere definito senza dati iniziali, ad es. calcolo del valore di π un algoritmo puo’ essere applicabile a un dato solo, ad es. trovare la posizione della prima terna di cifre uguali nel dato √ 2 (radice di due) oppure a un numero finito di dati, es. calcolo di una funzione definita per numeri interi da 1 a 10, oppure a un numero infinito di dati, ad es. calcolo di n 2 oppure ad un numero infinito 2 di dati, ecc

formalismi 59 Esistono moltissimi formalismi per definire (esprimere, specificare) algoritmi: formalismi astratti: Macchina di

formalismi 59 Esistono moltissimi formalismi per definire (esprimere, specificare) algoritmi: formalismi astratti: Macchina di Turing, (vedremo nel prossimo capitolo) Lambda Calcolo, . . linguaggi di programmazione per calcolatori: linguaggi macchina, . . . linguaggi di programmazione procedurali, o imperativi es. : Algol, Basic, C++, Cobol, Fortran, Java, Pascal, . . . ling. di progr. funzionali (Lisp, Scheme, . . . ), ling. di progr. logici (Prolog, . . . ). .

. . . ancora sulla definizione di algoritmo. . . 60 la nozione di

. . . ancora sulla definizione di algoritmo. . . 60 la nozione di algoritmo o procedura effettivamente computabile e' del 1935, ed e’ stata ripresa da piu' autori con diversi formalismi negli anni 30, 40 e 50. oggi si puo’definire un algoritmo come un programma eseguibile da un calcolatore che a partire da un dato valido produce un risultato in un tempo finito e sempre lo stesso (*) esistono algoritmi (programmi) per risolvere un enorme quantita’ di problemi ma ATTENZIONE: non esistono algoritmi risolutivi per tutti i problemi [vedremo un esempio in dettaglio] ----------------------- (*) implicita l’ipotesi che il linguaggio di programmazione in cui scrivo il programma sia non ambiguo, deterministico e eseguibile dal calcolatore. . .

61 di seguito sono riportati alcuni esempi di problemi impostati per essere risolti con

61 di seguito sono riportati alcuni esempi di problemi impostati per essere risolti con procedure automatiche. . . (ma non tutti risolubili!)

qualche es. di problemi (. . procedimenti) di calcolo: 62 esempi di problemi: alcuni

qualche es. di problemi (. . procedimenti) di calcolo: 62 esempi di problemi: alcuni semplici, altri difficili fino a “praticamente intrattabili”, altri impossibili. . . 1) problema della somma di due interi di 4 cifre (abbiamo visto prima un procedimento) 2) dati due numeri, trovare il maggiore; 3) calcolo del capitale maturato dopo dieci anni, con dati l’ interesse composto e il capitale iniziale; 4) dati tre valori numerici a, b, c calcolare le radici dell’equazione di secondo grado a * x 2 + b * x + c = 0 5) dato un elenco di nomi e relativi numeri di telefono (in rubrica o elenco telefonico o nel cellulare della zia), trovare il num. o di telefono di una persona (ad. es. Mario Rossi);

qualche es. di problemi (. . procedimenti) di calcolo: 63 6) scrivere una lettera

qualche es. di problemi (. . procedimenti) di calcolo: 63 6) scrivere una lettera di sollecito di pagamento alla ditta “Prendich, Nonpagat, Fuggitto & co”. 7) calcolo della mossa vincente per ogni possibile situazione del gioco del filetto / della dama / degli scacchi 8) data una rete stradale di una citta' e le informazioni sui flussi di veicoli (per ogni strada e per ogni istante) trovare il percorso ottimo (tempo o consumo o altro) da casa propria all' universita'; 9) calcolo del percorso ottimo di un robot semovente in ambiente con ostacoli (ad es. durante una partita di calcio del campionato internazionale per squadre di robot); 10) calcolo dei comandi per il controllo di una macchina operatrice di un impianto industriale;

qualche es. di problemi (. . procedimenti) di calcolo: 11) calcolo delle tasse per

qualche es. di problemi (. . procedimenti) di calcolo: 11) calcolo delle tasse per gli studenti del primo anno della facolta' di ingegneria; 12) calcolo del comando da trasmettere sull' interfaccia MIDI nell'ambito di un programma che produce musica da partitura memorizzata da/di Buxtehude; 13) calcolo dell’immagine da inviare sullo schermo sinistro relativo al gioco virtuale Destroyer 71; 14) scrittura automatica da parlato di Porpetto 15) traduzione automatica delle poesie di Saba in urdu 16) scrivere tutti gli n per cui l' equazione x n + y n = z n ha soluzioni x, y, z intere; 64

qualche es. di problemi (. . procedimenti) di calcolo: 65 17) scrivere un programma

qualche es. di problemi (. . procedimenti) di calcolo: 65 17) scrivere un programma per comprimere una sequenza di immagini video codificate in versione digitale in modo da poter memorizzare dieci filmati su un disco da 10 Mega byte senza degrado dell'immagine 18) scrivere un programma che controlla se un qualunque programma scritto in C++ e’ sintatticamente corretto e se si ferma dopo un numero finito e limitato di passi 19) trovare una procedura per decidere per ogni x intero e per ogni f(x) (f funzione da intero) se f(x) e' o meno una funzione costante; 20) scrivere un programma per decidere il primo ottobre per ogni matricola del corso di Fondamenti di Informatica se passera’ l’esame entro la prossima sessione.

- ancora sui procedimenti di calcolo: 66 specifica del problema: in ogni caso si

- ancora sui procedimenti di calcolo: 66 specifica del problema: in ogni caso si chiede di ottenere a partire da certe informazioni iniziali (dati di ingresso del problema) informazioni nuove, o risultati del problema. MA la formulazione del problema non da' alcuna indicazione su come risolvere il problema, ne' se il problema HA una o piu' soluzioni o se non ne ha nessuna, talvolta il problema e’ ambiguo: ad es. cerco il nome Furlan Giuseppe nella guida telefonica di Trieste e trovo molti nomi uguali.

talvolta il problema e’ praticamente intrattabile, 67 perche’ richiede un numero di passi troppo

talvolta il problema e’ praticamente intrattabile, 67 perche’ richiede un numero di passi troppo grande (un esempio: per calcolare la funzione di Ackermann A(4, 2) ci vuole un po’ di tempo (circa n secondi [dipende dalla macchina] ), il risultato e’ un numero intero di 19729 cifre: A(4, 2) = 2, 00352. . . 6733 x 10 +19728 ; (H. J. Smith, programma VPCalc per calcoli con dati fino a 114. 639 cifre e con valori di grandezza fino a 10^15. 032. 385. 525, da: Modula. Tor nr. 11, vol. 1, dec 91) per il calcolo A(4, 3) ci vorrebbero tempo: piu’ di A(4, 2) secondi [piu’di 10. 000 anni] e un calcolatore con piu’ di A(4, 2) byte di memoria [k Gbyte, dove k ha piu’di 10. 000 cifre. . . ]. . . e’ un problema non risolubile in pratica

problemi insolubili talvolta si dimostra che un problema non ha soluzione ad es. il

problemi insolubili talvolta si dimostra che un problema non ha soluzione ad es. il problema di decidere per ogni x intero e ogni funzione f(x) da intero se f(x) e' costante o no, ovvero trovare una F tale che F(f) = 1 se f(x) e’ costante per tutti gli x e F(f) = 0 se f(x) non e’ costante si puo’ dimostrare che il problema NON ha soluzione (sono problemi posti in modo troppo generale!) 68

problemi insolubili Un altro problema che non ha soluzione e’ il seguente “Halting Problem”

problemi insolubili Un altro problema che non ha soluzione e’ il seguente “Halting Problem” : (si puo’ dimostrare) Premessa: un compilatore e' un programma che traduce un programma scritto in un linguaggio di programmazione (come il C++) in un linguaggio macchina (linguaggio delle istruzioni macchina di un calcolatore) Ogni compilatore analizza il testo di un programma generico e per prima cosa decide se la sintassi e’ corretta oppure no; 69

problemi insolubili problema dell'arresto o “Halting non ha soluzione : 70 Problem” scrivere (il

problemi insolubili problema dell'arresto o “Halting non ha soluzione : 70 Problem” scrivere (il testo di) un programma (un “super-compiler”) SC che sia in grado di leggere un testo di un programma generico P e di un dato generico D per il programma P, e poi (analizzando il testo P e i dati D) sia in grado di rispondere se * il programma P con questo dato generico D una volta avviata l’esecuzione si ferma in un tempo finito (si arresta dopo aver eseguito un numero finito di istruzioni) * oppure no, ovvero se il programma P con dato D da' luogo ad una computazione infinita.

quanti sono gli algoritmi? 71

quanti sono gli algoritmi? 71

gli algoritmi sono numerabili? 72 l' insieme degli algoritmi e’ infinito ma numerabile. .

gli algoritmi sono numerabili? 72 l' insieme degli algoritmi e’ infinito ma numerabile. . . ovvero vi sono tanti algoritmi quanti i numeri naturali infatti, basta pensare che un programma e’ un testo (in C o altro linguaggio di programmazione procedurale); quindi posso immaginare di costruire una sequenza di tutti i programmi in C, iniziando dal piu’ piccolo - il programma vuoto “main(){}” e poi “allungando” in ordine lessicografico con istruzioni che mantengano la sintassi legale; abbiamo cosi' definito un procedimento meccanico per elencare (e quindi numerare) tutti i programmi in C. . .

piu' algoritmi o piu' funzioni ? 73 l' insieme di algoritmi e’ infinito ma

piu' algoritmi o piu' funzioni ? 73 l' insieme di algoritmi e’ infinito ma numerabile, ovvero vi sono tanti algoritmi quanti i numeri naturali ; ora, un algoritmo puo’ essere considerato come una funzione da intero (l’insieme dei dati " e’ " un intero (formato appunto da tutti i dati codificati "icollati" tra loro), l’insieme dei risultati " e’ " un intero); (es. : calcolo del massimo di tre numeri positivi di 5 cifre: i tre numeri possono essere considerati riscritti come un unico numero ad esempio (7777, 123, 450) posso scriverlo 000077770000012300000450 -> ho un intero come dato ; -)

piu' algoritmi o piu' funzioni ? 74 quindi, dato che il numero di algoritmi

piu' algoritmi o piu' funzioni ? 74 quindi, dato che il numero di algoritmi e’ infinito ma numerabile, e un algoritmo e' una funzione da intero e il numero di funzioni da intero non e’ numerabile quindi : solo una piccola parte delle f(int)->int e’ un algoritmo! ovvero: la maggior parte delle funzioni da intero NON sono algoritmi !

75 il numero di algoritmi e’ infinito ma numerabile il numero di funzioni da

75 il numero di algoritmi e’ infinito ma numerabile il numero di funzioni da intero non e’ numerabile – e quindi solo una piccola parte delle f(int)->int sono algoritmi! ci fermiamo qui. . .