La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Process synchronization

Presentazioni simili


Presentazione sul tema: "Process synchronization"— Transcript della presentazione:

1 Process synchronization
Operating System La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 12 Maggio 2016 © 2005 William Fornaciari

2 Riscaldiamoci subito un po’…

3 Riscaldiamoci subito un po’…

4 Obiettivi Induzione matematica Iterazione Cosa significa “ricorsivo”
Iterazione Vs ricorsione

5 L’induzione matematica
Si usa nelle definizioni e nelle dimostrazioni

6 L’induzione matematica
Si usa nelle definizioni e nelle dimostrazioni Definizione: numeri pari 1) 0 è un numero pari 2) se n è un numero pari anche n+2 è un numero pari

7 L’induzione matematica
Si usa nelle definizioni e nelle dimostrazioni Definizione: numeri pari 1) 0 è un numero pari 2) se n è un numero pari anche n+2 è un numero pari Dimostrazione: dimostro che (2n)2=4n2 (distributività della potenza di 2 risp. alla moltiplicazione) 1) n=1 : vero 2) suppongo sia vero per k, lo dimostro per k+1: (2(k+1))2=(2k+2)2=(2k)2+8k+4= (per hp di induzione) 4k2 +8k+4 = 4(k2 +2k+1) = 4(k+1)2 1) è il passo base, 2) è il passo di induzione

8 Il tacchino induttivista
Un tacchino induttivista viene allevato in una fattoria del Maine (USA) Ogni giorno alle 7am Mr Jones porta il cibo al tacchino induttivista Il tacchino segue il seguente ragionamento: Il giorno 1 Mr Jones mi ha portato il 7am Ieri era il giorno “n” e Mr Jones mi ha portato il 7am Oggi è il giorno “n+1” ed il cibo è arrivato Tutti i 7am Mr Jones mi porterà il cibo … Thanksgiving

9 Iterazione e ricorsione
Sono i due concetti informatici che nascono dal concetto di induzione

10 Iterazione L’iterazione si realizza mediante la tecnica del ciclo
Il calcolo del fattoriale: 0!=1 n!=n(n-1)(n-2)….1 (realizzo un ciclo)

11 La ricorsione: definizione
Dal latino re-currere ricorrere, fare ripetutamente la stessa azione In informatica: si tratta di procedure/funzioni che richiamano se stesse Il concetto di ricorsione viene usato nel contesto di: algoritmi strutture dati

12 Scopo della programmazione ricorsiva
Lo scopo è quelo di risolvere un problema facendo riferimento allo stesso problma su scala ridotta La condizione di terminazione avviene quando si identifica uno o più casi semplici con soluzione immediata La struttura di un algoritmo ricorsivo è il seguente if (è il caso semplice) risolvilo else usa la ricorsione su dati ridotti

13 La ricorsione: che cos’è?
Ricorsione indiretta: Un sottoprogramma P chiama un sottoprogramma Q Q a sua volta chiama un terzo R, … R chiama nuovamente P Ricorsione diretta Un sottoprogramma P chiama se stesso durante la propria esecuzione

14 Un esempio classico Individuare, in un gruppo di palline l’unica pallina di peso maggiore delle altre facendo uso di una bilancia “a basculla” Per semplicità: il numero di palline sia una potenza di 3 Algoritmo Pesate: Se il gruppo di palline consiste in una sola pallina, allora essa è banalmente la pallina cercata, altrimenti procedi come segue. Dividi il gruppo di palline in tre e confronta due dei tre sottogruppi. Se i due gruppi risultano di peso uguale scarta entrambi, altrimenti scarta il gruppo non pesato e quello risultato di peso minore. Applica l’algoritmo Pesate al gruppo rimanente.

15 Altri esempi di ricorsione
La sommatoria di una sequenza di numeri Fattoriale: In arte e non solo… Fact(n)=n*Fact(n-1) Fact(0)=1

16 Il calcolo del fattoriale
In matematica, se n è un intero positivo, si definisce n fattoriale e si indica con n! il prodotto dei primi n numeri interi positivi minori o uguali di quel numero

17 Il main del fattoriale

18 Il fattoriale iterativo

19 Definizione ricorsiva del fattoriale
1) n!= se n=0 2) n!= n*(n-1)! se n>0 Riduce il calcolo a un calcolo più semplice Ha senso perché si basa sempre sul fattoriale del numero più piccolo, che io conosco Ha senso perché si arriva a un punto in cui non è più necessario riusare la def. 2) e invece si usa la 1) 1) è il passo base, 2) è il passo di ricorsione

20 Esempio di traccia Calcoliamo il fattoriale di 4:
4=0? No: calcoliamo il fattoriale di 3 e molt. per 4 3=0? No: calcoliamo il fattoriale di 2 e molt. per 3 2=0? No: calcoliamo il fattoriale di 1 e molt. per 2 1=0? No: calcoliamo il fattoriale di 0 e molt. per 1 0=0? Si: il fattoriale di 0 è 1. Risaliamo: il fattoriale di 1 è 1 per il fattoriale di 0 cioè 1*1=1 il fattoriale di 2 è 2 per il fattoriale di 1 cioè 2*1=2 il fattoriale di 3 è 3 per il fattoriale di 2 cioè 3*2=6 il fattoriale di 4 è 4 per il fattoriale di 3 cioè 4*6=24

21 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 n = 3 main

22 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(3) n = 3 main

23 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(2) fat= FattRic(3) n = 3 main

24 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(1) fat= FattRic(2) fat= FattRic(3) n = 3 main

25 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(0) fat= FattRic(1) fat= FattRic(2) fat= FattRic(3) n = 3 main

26 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(0) 1 fat= FattRic(1) fat= FattRic(2) fat= FattRic(3) n = 3 main

27 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(0) 1 fat= FattRic(1) 1 fat= FattRic(2) fat= FattRic(3) n = 3 main

28 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(0) 1 fat= FattRic(1) 1 fat= FattRic(2) 2 fat= FattRic(3) n = 3 main

29 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(0) 1 fat= FattRic(1) 1 fat= FattRic(2) 2 fat= FattRic(3) 6 n = 3 main

30 Il fattoriale ricorsivo
Calcolo del Fattoriale in modo ricorsivo: Fact(n)=n*Fact(n-1) Fact(0)=1 fat= FattRic(0) 1 fat= FattRic(1) 1 fat= FattRic(2) 2 fat= FattRic(3) 6 6 main

31 Altri esempi di funzioni ricorsive
La moltiplicazione I numeri di Fibonacci (dinamiche di popolazione) Il massimo in un array Il problema delle torri di Hanoi

32 Moltiplicazione Ideare un procedimento ricorsivo per calcolare il prodotto di due interi

33 Moltiplicazione Ideare un procedimento ricorsivo per calcolare il prodotto di due interi Nota: A*1=A; A*B = A + A*(B-1)

34 Moltiplicazione Ideare un procedimento ricorsivo per calcolare il prodotto di due interi Nota: A*1=A; A*B = A + A*(B-1) int MulRic(int a, int b) { int ris; if (b == 1) ris = a; else ris = a + MulRic(a ,b–1); return ris; }

35 Fibonacci Leonardo Fibonacci Matematico italiano
Compie numerosi viaggi e assimila le conoscenze matematiche del mondo arabo, Nel 1202 pubblica: il Liber abaci Con Liber abaci si propose di diffondere nel mondo scientifico occidentale le regole di calcolo note agli Arabi il sistema decimale

36 Il problema dei “conigli”
“Un tale mise una coppia di conigli in un luogo completamente circondato da un muro, per scoprire quante coppie di conigli discendessero da questa in un anno: per natura le coppie di conigli generano ogni mese un'altra coppia e cominciano a procreare a partire dal secondo mese dalla nascita.” L. Fibonacci da Liber Abaci

37 I numeri di Fibonacci Idea di base 1) fib(n)=1 se n=0 opp. n=1
2) fib(n)= fib(n-1) + fib(n-2) se n>1

38 Successione di Fibonacci
Fib(n)=Fib(n-1)+Fib(n-2) Fib(0)=0; Fib(1)=1; int fibRic (int n) { int ris; if (n == 0) ris = 0; else if (n == 1) ris = 1; else ris = fibRic(n–1) + fibRic(n–2); return ris; }

39 Massimo di un array Ideare un procedimento ricorsivo per calcolare il massimo di un array di interi

40 Massimo di un array Ideare un procedimento ricorsivo per calcolare il massimo di un array di interi Idea: max(vect[0 : N]) =max(vect[0],max(vect[1 : N]))

41 Massimo di un array Ideare un procedimento ricorsivo per calcolare il massimo di un array di interi Idea: max(vect[0 : N]) =max(vect[0],max(vect[1 : N])) int max(int *array, int n){ int maxs; if (n==1) return array[0]; /*Caso Array 1 elemento*/ if (n==2){ /*Caso Base*/ if (array[0]>array[1]) return array[0]; else return array[1]; } maxs = max(&array[1],n-1); /*Risolvi Problema Ridotto*/ if (array[0]>maxs)return array[0]; else return maxs;

42 Un problema interessante: La torre di Brahma

43 La leggenda Narra la leggenda che all'inizio dei tempi, Brahma portò nel grande tempio di Benares, sotto la cupola d'oro che si trova al centro del mondo, tre colonnine di diamante e sessantaquattro dischi d'oro, collocati su una di queste colonnine in ordine decrescente, dal più piccolo in alto, al più grande in basso. E' la sacra Torre di Brahma che vede impegnati, giorno e notte, i sacerdoti del tempio nel trasferimento della torre di dischi dalla prima alla terza colonnina. Essi non devono contravvenire alle regole precise, imposte da Brahma stesso, che richiedono di spostare soltanto un disco alla volta e che non ci sia mai un disco sopra uno più piccolo. Quando i sacerdoti avranno completato il loro lavoro e tutti i dischi saranno riordinati sulla terza colonnina, la torre e il tempio crolleranno e sarà la fine del mondo.

44 Problema: spostare tutti i dischi dalla torre A alla torre B
Le torri di Hanoi Problema: spostare tutti i dischi dalla torre A alla torre B (usando la torre C come “supporto intermedio”) in modo che si trovino nello stesso ordine

45 Le torri di Hanoi Scriveremo una funzione ricorsiva che prende come parametro il numero del disco più grande che vogliamo spostare (da 0 a 5 come nel disegno) La funzione prenderà anche tre parametri che indicano: da quale asta vogliamo partire (source), a quale asta vogliamo arrivare (dest), l’altra asta, che possiamo usare come supporto temporaneo (spare).

46 L’idea di base Voglio spostare n anelli dal piolo sorgente, a quello destinazione, usando come appoggio il piolo ausiliario Devo quindi prima spostare n - 1 anelli dal sorgente all'ausiliario, usando come appoggio il piolo destinazione Poi sposto l'unico anello rimasto dal sorgente al piolo destinazione Infine sposto gli n - 1 anelli che si trovano sull'ausilliario all'anello destinazione..

47 L’uso della ricorsione
Quando si spostano gli n - 1 anelli la funzione hanoi richiama se stessa, cioè effettua una chiamata ricorsiva, semplificando però il problema perché bisogna spostare un numero di anelli inferiore. In pratica, con la ricorsione il problema viene continuamente ridotto di complessità fino alla soluzione banale in cui rimane solo un anello, che viene semplicemente spostato nel piolo destinazione.

48 Le torri di Hanoi: strategia
Ridurremo il problema a quello di spostare 5 dischi dalla torre C alla torre B, dopo che il disco 5 è stato già messo nella posizione giusta

49 Le torri di Hanoi: pseudocodice
FUNCTION MoveTower(disk, source, dest, spare): IF disk == 0, THEN: move disk from source to dest ELSE: MoveTower(disk - 1, source, spare, dest) /* (Passo 1) */ move disk from source to dest // /* (Passo 2) */ MoveTower(disk - 1, spare, dest, source) // /* (Passo 3) */ END IF Nota: l’algoritmo aggiunge un caso base: quando il disco è il più piccolo (il numero 0). In questo caso possiamo muoverlo direttamente perché non ne ha altri sopra. Negli altri casi, seguiamo la procedura descritta per il disco 5.

50 Codice void hanoi(int n, int sorgente, int destinazione, int aux) {
if (n==1) printf("Sposto da %d a %d.\n",sorgente, destinazione); else{ hanoi(n - 1, sorgente, aux, destinazione); hanoi(1, sorgente, destinazione, aux); hanoi(n - 1, aux, destinazione, sorgente); }

51 Fonti per lo studio + Credits
Introduzione alla programmazione in MATLAB, A.Campi, E.Di Nitto, D.Loiacono, A.Morzenti, P.Spoletini, Ed.Esculapio Capitolo 4 Particolare attenzione al 4.5 Credits Prof. A. Morzenti Gianluca Palermo


Scaricare ppt "Process synchronization"

Presentazioni simili


Annunci Google