La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Introduzione alla Ricorsione Corso di Informatica A Vito Perrone.

Presentazioni simili


Presentazione sul tema: "1 Introduzione alla Ricorsione Corso di Informatica A Vito Perrone."— Transcript della presentazione:

1 1 Introduzione alla Ricorsione Corso di Informatica A Vito Perrone

2 Copyright © The McGraw-Hill Companies, srl 2 Ricorsione Informatica A – V. Perrone Indice La formulazione in termini ricorsivi di problemi e algoritmi La ricorsione come strumento di programmazione L esecuzione dei sottoprogrammi ricorsivi Ulteriori esempi

3 Copyright © The McGraw-Hill Companies, srl 3 Ricorsione Informatica A – V. Perrone La formulazione in termini ricorsivi di problemi e algoritmi La ricorsione: che cosè? –Un sottoprogramma P chiama -durante la sua esecuzione- un altro sottoprogramma Q –Q a sua volta chiama un terzo R, … –R chiama nuovamente P: (ricorsione indiretta) –Oppure P chiama se stesso durante la propria esecuzione (ricorsione diretta)

4 Copyright © The McGraw-Hill Companies, srl 4 Ricorsione Informatica A – V. Perrone Un esempio classico Individuare, in un gruppo di palline lunica 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 lalgoritmo Pesate al gruppo rimanente.

5 Copyright © The McGraw-Hill Companies, srl 5 Ricorsione Informatica A – V. Perrone Esempi matematici (1) 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

6 Copyright © The McGraw-Hill Companies, srl 6 Ricorsione Informatica A – V. Perrone Esempi matematici (2) 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

7 Copyright © The McGraw-Hill Companies, srl 7 Ricorsione Informatica A – V. Perrone Esempi matematici (3) La sommatoria di una sequenza di numeri Es. {2,5,7,9} n=4

8 Copyright © The McGraw-Hill Companies, srl 8 Ricorsione Informatica A – V. Perrone Esempi matematici (4) 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

9 Copyright © The McGraw-Hill Companies, srl 9 Ricorsione Informatica A – V. Perrone La ricorsione come strumento di programmazione Programma Fibonacci : intfibonacci (intn) { intris; if (n == 0) ris = 0; else if (n == 1) ris = 1; else ris = fibonacci(n–1) + fibonacci(n–2); returnris; }

10 Copyright © The McGraw-Hill Companies, srl 10 Ricorsione Informatica A – V. Perrone Esempio Fattoriale 5! = 5*4*3*2*1 n! = n*(n-1)! 0! = 0 <- convenzione

11 Copyright © The McGraw-Hill Companies, srl 11 Ricorsione Informatica A – V. Perrone Lesecuzione di sottoprogrammi ricorsivi (1) 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

12 Copyright © The McGraw-Hill Companies, srl 12 Ricorsione Informatica A – V. Perrone 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 Lesecuzione di sottoprogrammi ricorsivi (2)

13 Copyright © The McGraw-Hill Companies, srl 13 Ricorsione Informatica A – V. Perrone Passaggio parametri -anche- per indirizzo: voidincrementa(int *n, int m) { if (m != 0) { *n = *n + 1; incrementa(n, m–1); } Lesecuzione di sottoprogrammi ricorsivi (3)

14 Copyright © The McGraw-Hill Companies, srl 14 Ricorsione Informatica A – V. Perrone Lesecuzione di sottoprogrammi ricorsivi (4) 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

15 Copyright © The McGraw-Hill Companies, srl 15 Ricorsione Informatica A – V. Perrone Lesecuzione di sottoprogrammi ricorsivi (5): la gestione a pila della memoria (a) 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"

16 Copyright © The McGraw-Hill Companies, srl 16 Ricorsione Informatica A – V. Perrone 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 Lesecuzione di sottoprogrammi ricorsivi (6): la gestione a pila della memoria (b)

17 Copyright © The McGraw-Hill Companies, srl 17 Ricorsione Informatica A – V. Perrone 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 Lesecuzione di sottoprogrammi ricorsivi (7): la gestione a pila della memoria (c)

18 Copyright © The McGraw-Hill Companies, srl 18 Ricorsione Informatica A – V. Perrone Ulteriori esempi (1) /* Programma RicPalindr*/ #include typedefenum {false, true} boolean; voidmain () { #defineLunghMaxStringa100 charStringa1[LunghMaxStringa]; booleanOK; unsignedLunghStringa; booleanPalindrome (char *PC, char *UC); /* Listruzione seguente assume che i caratteri componenti la stringa non siano spazi */ scanf ("%s", Stringa1); LunghStringa = strlung (Stringa1); if (LunghStringa == 0) printf ("La stringa è palindroma"); else …

19 Copyright © The McGraw-Hill Companies, srl 19 Ricorsione Informatica A – V. Perrone Ulteriori esempi (2) /* 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"); } booleanPalindrome (char, *PC, char *UC) …

20 Copyright © The McGraw-Hill Companies, srl 20 Ricorsione Informatica A – V. Perrone /* Programma RicPalindr*/ … booleanPalindrome (char, *PC, char *UC) { if(PC >= UC) /* Se la stringa è vuota o è costituita da un solo carattere */ return true; elseif (*PC != *UC) /* Se il primo e l'ultimo carattere sono diversi */ return false; else /* Chiama se stessa ricorsivamente escludendo il primo e l'ultimo carattere */ return Palindrome (PC+1, UC–1); } Ulteriori esempi (3)


Scaricare ppt "1 Introduzione alla Ricorsione Corso di Informatica A Vito Perrone."

Presentazioni simili


Annunci Google