Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
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
LLN?: L = empty LN ? SI 100N e empty LN ? SI 8N e empty LN ? SI 4N e empty LN ? SI 5N e 28. empty LN ? 28N e empty LN ? SI SI SI Programmazione di Calcolatori: la ricorsione
11
Le strutture ricorsive
LLN?: L = 100.8, empty LN ? SI 100N e 8, empty LN ? NO 8,5N e empty LN ? NO Programmazione di Calcolatori: la ricorsione
12
Le strutture ricorsive
Qual è la somma degli elementi di LLN (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 LLT: 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
LLT è 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 LLN? 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 LLN? 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
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.