La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

La Programmazione Ricorsiva Dr. Mario Pavone CdL Informatica Applicata Università di Catania.

Presentazioni simili


Presentazione sul tema: "La Programmazione Ricorsiva Dr. Mario Pavone CdL Informatica Applicata Università di Catania."— Transcript della presentazione:

1 La Programmazione Ricorsiva Dr. Mario Pavone CdL Informatica Applicata Università di Catania

2 Programmazione ricorsiva Chiamata ricorsiva di sottoprogrammi: Un sottoprogramma P chiama -durante la sua esecuzione- un altro sottoprogramma Q Q a sua volta chiama un terzo R, … ricorsione indiretta R chiama nuovamente P: (ricorsione indiretta) ricorsione diretta Oppure P chiama se stesso durante la propria esecuzione (ricorsione diretta) La soluzione di un dato problema può essere ricavata sulla base della soluzione di un suo sottoproblema più sempliceLa soluzione di un dato problema può essere ricavata sulla base della soluzione di un suo sottoproblema più semplice

3 Un primo esempio di ricorsione Individuare, in un gruppo di palline lunica pallina di peso maggiore delle altre facendo uso di una bilancia a basculla dotata di due piatti in grado di stabilire se i pesi sono uguali o quale dei due è maggiore Per semplicità: il numero di palline sia una potenza di 3 Goal: risolvere il problema con il minor numero di pesate Algoritmo Pesate: Se il gruppo di palline consiste in una sola pallina, allora essa è banalmente la pallina cercata, altrimenti: 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 lalgoritmo Pesate al gruppo rimanente.

4 Ricorsione e matematica x + 0 = x; x + y = x + Successore(y–1) = Successore (x + (y– 1)) : 1+3 =Successore (1+2) = Successore(Successore(1+1)) = Successore(Successore(Successore(1+0))) = Successore(Successore(Successore(1))) = Successore(Successore(2)) = Successore(3) = 4

5 Ricorsione e matematica I numeri di Fibonacci, F = {f 0,..., f n }: f 0 = 0 f 1 = 1 Per n > 1, f n = f n–1 + f n–2 Esempio: f 0 = 0 f 1 = 1 f 2 = f 1 + f 0 = = 1 f 3 = f 2 + f 1 = = 2 f 4 = f 3 + f 2 = = 3

6 Ricorsione e matematica La lista inversa L –1 di una lista di elementi L = {a 1,..., a n }: se n = 1, L –1 = L; altrimenti, L –1 = {a n, (L n–1 ) –1 } Dove L n–1 indica la lista ottenuta da L cancellando lultimo elemento a n. Esempio: 2,7,5,4 –1 = 4, 2,7,5 –1 = 4, 5, 2,7 –1 = 4, 5, 7, 2 –1 = 4, 5, 7, 2

7 Esercizio sulla ricorsione Scrivere un programma che calcoli la seguente sommatoria: si consideri come esempio la successione {2, 5, 7, 9} con n=4

8 Ricorsione come strumento di programmazione Calcolo del Fattoriale in modo ricorsivo: intFattRic(int n) { intris; if (n == 0) ris = 1; else ris = n * FattRic(n–1); returnris; }

9 Ricorsione come strumento di programmazione Calcolo dei numeri di Fibonacci : int fibonacci (intn) { int ris; if (n == 0) ris = 0; else if (n == 1) ris = 1; else ris = fibonacci(n–1) + fibonacci(n–2); return ris; }

10 Sottoprogrammi ricorsivi Calcolo del fattoriale di 3 (secondo lo schema conosciuto): Il valore del parametro attuale, 3, viene copiato nel parametro formale, n Ha inizio lesecuzione di FattRic. Essa giunge a n*FattRic(2), il cui risultato dovrebbe essere assegnato alla cella FattRic per poi essere passato al chiamante. A questo punto avviene la nuova chiamata di FattRic. Il nuovo valore del parametro attuale, 2, viene copiato nella cella n, cancellando il precedente valore 3

11 Sottoprogrammi ricorsivi record di attivazione Seconda attivazione 2 Terza attivazione 1 Quarta attivazione 0 1*1 = 1 2*1 = 2 Prima attivazione nFattRic 3 3*2 = 6 1

12 Sottoprogrammi ricorsivi Passaggio parametri per valore e per indirizzo: void incrementa(int *n, int m) { if (m != 0) { *n = *n + 1; incrementa(n, m–1); }

13 Sottoprogrammi ricorsivi y 3 Area dati della funzione chiamante x 2 Prima attivazione n m 3 3 Seconda attivazione 2 4 Terza attivazione 1 5 Quarta attivazione 0 5 incrementa(&x, y), con x=2 e y=3

14 pila Gestione a pila della memoria Variabili globali main record di attivazione del main P1 record di attivazione di P1 P2 record di attivazione di P2 P3 record di attivazione di P3 P2 record di attivazione di P2"

15 pila Gestione a pila della memoria P1P2P3P2main Variabili globali record di attivazione del main record di attivazione di P1 record di attivazione di P2 record di attivazione di P3 record di attivazione di P2" P3 P2

16 pila Gestione a pila della memoria Variabili globali record di attivazione del main record di attivazione di P1 record di attivazione di P2 P3P2 mainP1P2P3P2 P4 record di attivazione di P4 P2 P1 main

17 Esempio di ricorsione: stringa palindroma /* Programma RicPalindr*/ #include typedef enum {false, true} boolean; void main () { #define LunghMaxStringa 100 charStringa1[LunghMaxStringa]; booleanOK; unsignedLunghStringa; booleanPalindrome (char *PC, char *UC); scanf ("%s", Stringa1); LunghStringa = strlung (Stringa1); if (LunghStringa == 0) printf ("La stringa è palindroma"); else …

18 Esempio di ricorsione: stringa palindroma /* Programma RicPalindr*/ … else { /* Viene chiamata la funzione Palindrome passando per indirizzo il primo e l'ultimo carattere della stringa da analizzare */ OK = Palindrome (&Stringa1[0], &Stringa1[LunghStringa–1]; if (OK == true) printf ("La stringa è palindroma); else printf ("La stringa non è palindroma"); }

19 Esempio di ricorsione: stringa palindroma /* Programma RicPalindr*/ booleanPalindrome (char, *PC, char *UC) { /* la stringa è vuota o è costituita da un solo carattere */ if (PC >= UC) return true; else /* Se il primo e l'ultimo carattere sono diversi */ if (*PC != *UC) return false; /* Chiama se stessa ricorsivamente escludendo il primo e l'ultimo carattere */ else return Palindrome (PC+1, UC–1); }


Scaricare ppt "La Programmazione Ricorsiva Dr. Mario Pavone CdL Informatica Applicata Università di Catania."

Presentazioni simili


Annunci Google