340 likes | 472 Views
Programmazione di Calcolatori. Lezione XXVII La ricorsione. La ricorsione. Definizione ricorsiva: definizione di un oggetto (un insieme, una struttura, una funzione, …) in termini della definizione dell’oggetto stesso Comportamento ricorsivo
E N D
Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione
La ricorsione • Definizione ricorsiva: • definizione di un oggetto (un insieme, una struttura, una funzione, …) in termini della definizione dell’oggetto stesso • Comportamento ricorsivo • quello esibito da una classe di oggetti definibili tramite due proprietà: • un insieme di casi base • un insieme di regole che riducono qualsiasi caso a uno dei casi base Programmazione di Calcolatori: la ricorsione
Le funzioni ricorsive • Il fattoriale: • I numeri di Fibonacci: Programmazione di Calcolatori: la ricorsione
Le funzioni ricorsive • Il calcolo: • fatt(5) = 5 * fatt(4) = • = 5 * 4 * fatt(3) = • = 5 * 4 * 3 * fatt(2) = • = 5 * 4 * 3 * 2 * fatt(1) = • = 5 * 4 * 3 * 2 * 1 * fatt(0) = • = 5 * 4 * 3 * 2 * 1 * 1 = Programmazione di Calcolatori: la ricorsione
Le funzioni ricorsive // Nome e posizione del file: // Lezione_XXVII/fatt.c // Descrizione del contenuto del file: // funzioni per il calcolo ricorsivo del fattoriale // Descrizione della funzionalita' implementata: // calcola ricorsivamente il fattoriale di un intero positivo // Tipo, nome e significato dei parametri della funzione: // int n: valore dell'argomento del fattoriale // Tipo e significato del valore restituito: // int: fattoriale del valore fornito in ingresso int fatt(int n) { // il fattoriale di 0 e' 1 if (n == 0) return(1); // il fattoriale di n, con n diverso da, e' n per il fattoriale di n-1 return(n*fatt(n-1)); }; Programmazione di Calcolatori: la ricorsione
Le funzioni ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le funzioni ricorsive // Nome e posizione del file: // Lezione_XXVII/fibonacci.c // Descrizione del contenuto del file: // funzioni per il calcolo ricorsivo // della sequenza di fibonacci // Descrizione della funzionalita' implementata: // calcola l’n-esimo numero della sequenza di fibonacci // Tipo, nome e significato dei parametri della funzione: // int n: posizione del numero all'interno della sequenza di fibonacci // Tipo e significato del valore restituito: // int: l'n-esimo valore della sequenza di fibonacci int fib(int n) { // il primo numero nella sequenza di fibonacci e' 0 if (n == 0) return(0); // il secondo numero nella sequenza di fibonacci e' 1 if (n == 1) return(1); // l'n-esimo numero nella sequenza di fibonacci, con n > 1, e' la somma // dell'(n-1)-esimo e dell'(n-2)-esimo numero della stessa sequenza return(fib(n-1)+fib(n-2)); }; Programmazione di Calcolatori: la ricorsione
Le funzioni ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Lista di valori di tipo T (LT): • Le liste: • tn.tn-1. … . t2. t1. empty Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • LLN?: • L = 100.8.4. 5. 28. empty LN ? SI 100Ne 8.4. 5. 28. empty LN ? SI • 8N e 4. 5. 28. empty LN ? SI • 4N e 5. 28. empty LN ? SI • 5N e 28. empty LN ? • 28N e empty LN ? SI SI SI Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • LLN?: • L = 100.8,5.4. 5. 28. empty LN ? SI 100Ne 8,5.4. 5. 28. empty LN ? NO • 8,5N e 4. 5. 28. empty LN ? NO Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Qual è la somma degli elementi di LLN (liste di naturali)? Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive // Nome e posizione del file: // Lezione_XXVII/somma.c // Descrizione del contenuto del file: // funzioni per il calcolo ricorsivo della somma degli elementi di // un vettore di naturali (codificata con un vettore di interi) // Descrizione della funzionalita' implementata: // calcola ricorsivamente la somma degli elementi del vettore // Tipo, nome e significato dei parametri della funzione: // int vett: riferimento ad un vettore di interi // int dim: dimensione del vettore // Tipo e significato del valore restituito: // int: somma degli elementi del vettore int somma(int *vett, int dim) { // se il vettore e' vuoto la somma vale 0 if (dim == 0) return(0); // la somma degli elementi di un vettore di dimensione non nulla // e' pari al primo elemento del vettore + la somma degli // elementi nella parte rimanente del vettore return(vett[0] + somma(vett+1, dim-1); }; Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Ricerca ricorsiva di un elemento in LLT: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive // Nome e posizione del file: // Lezione_XXVII/cerca.c // Descrizione del contenuto del file: // funzioni per la ricerca ricorsiva di un valore all'interno di una lista di // naturali (codificata con un vettore di interi) // Descrizione della funzionalita' implementata: // ricerca ricorsivamente un valore all'interno di un vettore // Tipo, nome e significato dei parametri della funzione: // int vett: riferimento ad un vettore di interi // int dim: dimensione del vettore // int val: valore cercato // Tipo e significato del valore restituito: // int: 1 se l'elemento è presente; 0 altrimenti int cerca(int *vett, int dim, int val) { // se il vettore e' vuoto restituisce false if (dim == 0) return(0); // se il primo elemento del vettore coincide con il valore cercato restituisce 1 if (vett[0] == val) return(1); // altrimenti cerca lo stesso valore all'interno del vettore privato del // primo elemento return(cerca(vett+1, dim-1, val, nro_call, lev_of_nest+1)); }; Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • LLTè ordinata in modo strettamente crescente? Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive // Nome e posizione del file: // Lezione_XXVII/ordinata.c // Descrizione del contenuto del file: // funzioni che verificano se una // lista di interi e' ordinata // Descrizione della funzionalita' implementata: // verifica ricorsivamente se la lista e' ordinata // Tipo, nome e significato dei parametri della funzione: // int vett: riferimento ad un vettore di interi // int dim: dimensione del vettore // Tipo e significato del valore restituito: // int: 1 se la lista e' ordinata; 0 altrimenti int ordinata (int *vett, int dim) { // se il vettore e' vuoto restituisce 1 if (dim == 0) return(1); // se la lista contiene un solo elemento restituisce 1 if (dim == 1) return(1); // se il primo elemento della lista e' superiore al secondo restituisce 0 if (vett[0] > vett[1]) return(0); // altrimenti verifica il vettore privato del primo elemento return(ordinata(vett+1, dim-1)); }; Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Qual è il massimo di LLN? Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • // Nome e posizione del file: • // Lezione_XXVII/max_1.c • // Descrizione del contenuto del file: • // funzioni per il calcolo ricorsivo • // del massimo di una lista di • // naturali • // Descrizione della funzionalita' implementata: • // calcola ricorsivamente il massimo degli elementi del vettore • // Tipo, nome e significato dei parametri della funzione: • // int vett: riferimento ad un vettore di interi • // int dim: dimensione del vettore • // Tipo e significato del valore restituito: • // int: massimo degli elementi del vettore • int max(int *vett, int dim) • { • // se il vettore e' vuoto il massimo è 0 • if (dim == 0) return(0); • // se il vettore contiene un solo elemento il massimo e' l'elemento stesso • if (dim == 1) return(vett[0]); • // se il primo elemento e' maggiore del massimo della parte rimanente • // del vettore il massimo e' il primo elemento • if (vett[0] >= max(vett+1, dim-1)) • return(vett[0]); • else • // altrimenti il massimo e' quello della parte rimanente del vettore • return(max(vett+1, dim-1)) • }; Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive // Nome e posizione del file: // Lezione_XXVII/max_1_o.c // Descrizione del contenuto del file: // funzioni per il calcolo ricorsivo // del massimo di una lista di // naturali limitando il numero // delle chiamate ricorsive // Descrizione della funzionalita' implementata: // calcola ricorsivamente il massimo degli elementi del vettore // Tipo, nome e significato dei parametri della funzione: // int vett: riferimento ad un vettore di interi // int dim: dimensione del vettore // Tipo e significato del valore restituito: // int: massimo degli elementi del vettore int max(int *vett, int dim) { // definisce una variabile di appoggio per il massimo int aux; // se il vettore e' vuoto il massimo e' 0 if (dim == 0) return(0); // se il vettore contiene un solo elemento il massimo e' l'elemento stesso if (dim == 1) return(vett[0]); Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive // se il primo elemento e' maggiore del massimo della parte rimanente // del vettore il massimo e' il primo elemento if (vett[0] >= (aux=max(vett+1, dim-1))) return(vett[0]); else // altrimenti il massimo e' quello della parte rimanente del vettore return(max(vett+1, dim-1)); }; Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Qual è il massimo di LLN? Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive // Nome e posizione del file: // Lezione_XXVII/max_2.c // Descrizione del contenuto del file: // funzioni per il calcolo ricorsivo // del massimo degli elementi di // una lista di naturali // Tipo, nome e significato dei parametri della funzione: // int vett: riferimento ad un vettore di interi // int dim: dimensione del vettore // Descrizione della funzionalita' implementata: // calcola ricorsivamente il massimo degli elementi del vettore // Tipo e significato del valore restituito: // int: massimo degli elementi del vettore int max(int *vett, int dim) { // se il vettore e' vuoto il massimo è 0 if (dim == 0) return(0); // se il vettore contiene un solo elemento il massimo e' // l'elemento stesso if (dim == 1) return(vett[0]); Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive // se il primo elemento e' maggiore del secondo, il massimo e' il massimo // tra il primo elemento e gli elementi del vettore a partire dal terzo if (vett[0] >= vett[1]) { //scambia il primo elemento con il secondo scambia(vett, vett+1); return(max(vett+1, dim-1)); } else // altrimenti il massimo e' il massimo tra il II elemento e gli elementi // del vettore a partire dal terzo return(max(vett+1, dim-1)); }; Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione
Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione