La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Programmazione di Calcolatori

Presentazioni simili


Presentazione sul tema: "Programmazione di Calcolatori"— Transcript della presentazione:

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

2 La ricorsione Definizione ricorsiva: Comportamento ricorsivo
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 * 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 = empty LN ? SI 100N e empty LN ? SI 8N e empty LN ? SI 4N e 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, empty LN ? SI 100N e 8, empty LN ? NO 8,5N e 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) // 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 }; 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


Scaricare ppt "Programmazione di Calcolatori"

Presentazioni simili


Annunci Google