1 / 34

Programmazione di Calcolatori

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

simeon
Download Presentation

Programmazione di Calcolatori

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione

  2. 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

  3. Le funzioni ricorsive • Il fattoriale: • I numeri di Fibonacci: Programmazione di Calcolatori: la ricorsione

  4. 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

  5. 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

  6. Le funzioni ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  7. 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

  8. Le funzioni ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  9. Le strutture ricorsive • Lista di valori di tipo T (LT): • Le liste: • tn.tn-1. … . t2. t1. empty Programmazione di Calcolatori: la ricorsione

  10. Le strutture ricorsive • LLN?: • L = 100.8.4. 5. 28. empty LN ? SI 100Ne 8.4. 5. 28. empty LN ? SI • 8N e 4. 5. 28. empty LN ? SI • 4N e 5. 28. empty LN ? SI • 5N e 28. empty LN ? • 28N e empty LN ? SI SI SI Programmazione di Calcolatori: la ricorsione

  11. Le strutture ricorsive • LLN?: • L = 100.8,5.4. 5. 28. empty LN ? SI 100Ne 8,5.4. 5. 28. empty LN ? NO • 8,5N e 4. 5. 28. empty LN ? NO Programmazione di Calcolatori: la ricorsione

  12. Le strutture ricorsive • Qual è la somma degli elementi di LLN (liste di naturali)? Programmazione di Calcolatori: la ricorsione

  13. 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

  14. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  15. Le strutture ricorsive • Ricerca ricorsiva di un elemento in LLT: Programmazione di Calcolatori: la ricorsione

  16. 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

  17. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  18. Le strutture ricorsive • LLTè ordinata in modo strettamente crescente? Programmazione di Calcolatori: la ricorsione

  19. 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

  20. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  21. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  22. Le strutture ricorsive • Qual è il massimo di LLN? Programmazione di Calcolatori: la ricorsione

  23. 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

  24. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  25. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  26. 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

  27. 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

  28. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  29. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  30. Le strutture ricorsive • Qual è il massimo di LLN? Programmazione di Calcolatori: la ricorsione

  31. 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

  32. 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

  33. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

  34. Le strutture ricorsive • Esecuzione: Programmazione di Calcolatori: la ricorsione

More Related