View
48
Download
0
Category
Preview:
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
G. Amodeo,C. Gaibisso Programmazione di Programmazione di
CalcolatoriCalcolatori
Lezione XXVIILa ricorsione
Programmazione di Calcolatori: la ricorsione 1
G. Amodeo,C. Gaibisso
La ricorsioneLa ricorsione
Programmazione di Calcolatori: la ricorsione 2
• 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
G. Amodeo,C. Gaibisso
Le funzioni ricorsiveLe funzioni ricorsive
Programmazione di Calcolatori: la ricorsione 3
• Il fattoriale:
otherwise )1(
0 if 1 )(
0 :
nfattn
nnfatt
NNfatt
otherwise 21
1n if 1
0 if 0
)(
0 :
)fib(n-nfib
n
nfib
NNfib
• I numeri di Fibonacci:
G. Amodeo,C. Gaibisso
Le funzioni ricorsiveLe funzioni ricorsive
Programmazione di Calcolatori: la ricorsione 4
• 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 =
G. Amodeo,C. Gaibisso
Le funzioni ricorsiveLe funzioni ricorsive
Programmazione di Calcolatori: la ricorsione 5
// 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 ingressoint fatt(int n)
{// il fattoriale di 0 e' 1if (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));
};
otherwise )1(
0 if 1 )(
nfattn
nnfatt
G. Amodeo,C. Gaibisso
Le funzioni ricorsiveLe funzioni ricorsive
Programmazione di Calcolatori: la ricorsione 6
• Esecuzione:
G. Amodeo,C. Gaibisso
Le funzioni ricorsiveLe funzioni ricorsive
Programmazione di Calcolatori: la ricorsione 7
// 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 fibonacciint fib(int n)
{// il primo numero nella sequenza di fibonacci e' 0if (n == 0)
return(0); // il secondo numero nella sequenza di fibonacci e' 1if (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)); };
otherwise 21
1n if 1
0 if 0
)(
)fib(n-nfib
n
nfib
G. Amodeo,C. Gaibisso
Le funzioni ricorsiveLe funzioni ricorsive
Programmazione di Calcolatori: la ricorsione 8
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 9
• Lista di valori di tipo T (LT):
. then and if TT
TT LLtL LT t
LemptyL
• Le liste:
tn.tn-1. … . t2. t1. empty
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 10
• LLN?:
L = 100.8.4. 5. 28. empty LN ?
8N e 4. 5. 28. empty LN ?4N e 5. 28. empty LN ?5N e 28. empty LN ?
28N e empty LN ?
100N e 8.4. 5. 28. empty LN ?SI
SI
SI
SI
SI SISI
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 11
• LLN?:
L = 100.8,5.4. 5. 28. empty LN ?
8,5N e 4. 5. 28. empty LN ?
100N e 8,5.4. 5. 28. empty LN ?SI
NO
NO
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 12
• Qual è la somma degli elementi di LLN (liste di naturali)?
if
if 0
:
t.L'Lsomma(L')t
emptyLsomma(L)
NLsomma N
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 13
if
if 0
t.L'Lsomma(L')t
emptyLsomma(L)
// 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 vettoreint somma(int *vett, int dim)
{ // se il vettore e' vuoto la somma vale 0if (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 vettorereturn(vett[0] + somma(vett+1, dim-1);};
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 14
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 15
• Ricerca ricorsiva di un elemento in LLT:
if otherwise
if
if
, :
(t'.L')L')cerca(t, L
t' ttrue
emptyLfalse
L)cerca(t,
falsetrueLNcerca N
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 16
// 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 altrimentiint 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)); };
if
otherwise
if
if
(t'.L')L
')cerca(t, L
t' ttrue
emptyLfalse
L)cerca(t,
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 17
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 18
• LLT è ordinata in modo strettamente crescente?
.. if
. if
if
, :
21 S'ttL
emptytLtrue
emptyLtrue
(L)ord
falsetrueLord T
otherwise
if
2
21
.L')(tord
ttfalse
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 19
// 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 altrimentiint ordinata (int *vett, int dim)
{// se il vettore e' vuoto restituisce 1if (dim == 0)
return(1); // se la lista contiene un solo elemento restituisce 1if (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 elementoreturn(ordinata(vett+1, dim-1));};
.. if
. if
if
21 S'ttL
emptytLtrue
emptyLtrue
(L)ord
otherwise
if
2
21
.L')(tord
ttfalse
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 20
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 21
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 22
• Qual è il massimo di LLN?
, if
. if
if 1
1 :
emptyL't.L'L
emptytLt
emptyL
max(L)
NLmax N
otherwise
if
max(L')
max(L')tt
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 23
// 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 vettoreint max(int *vett, int dim)
{ // se il vettore e' vuoto il massimo è 0if (dim == 0) return(0); // se il vettore contiene un solo elemento il massimo e'
l'elemento stessoif (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))};
if
. if
if 1
t.L'L
emptytLt
emptyL
max(L)
otherwise
if
max(L')
max(L')tt
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 24
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 25
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 26
// 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 vettoreint max(int *vett, int dim)
{// definisce una variabile di appoggio per il massimoint aux; // se il vettore e' vuoto il massimo e' 0if (dim == 0)
return(0); // se il vettore contiene un solo elemento il massimo e'
l'elemento stessoif (dim == 1)
return(vett[0]);
if
. if
if 1
t.L'L
emptytLt
emptyL
max(L)
otherwise
if
max(L')
max(L')tt
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 27
// 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)); };
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 28
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 29
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 30
• Qual è il massimo di LLN?
.. if
. if
if 1
1 :
21 L'ttL
emptytLt
emptyL
max(L)
NLmax N
otherwise
if
2
211
.L')max(t
tt.L') max(t
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 31
// 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 vettoreint max(int *vett, int dim)
{ // se il vettore e' vuoto il massimo è 0if (dim == 0)
return(0); // se il vettore contiene un solo elemento il massimo e' // l'elemento stessoif (dim == 1)
return(vett[0]);
.. if
. if
if 1
21 L'ttL
emptytLt
emptyL
max(L)
otherwise
if
2
211
.L')max(t
tt.L') max(t
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 32
// 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 secondoscambia(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 terzoreturn(max(vett+1, dim-1));
};
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 33
• Esecuzione:
G. Amodeo,C. Gaibisso
Le strutture ricorsiveLe strutture ricorsive
Programmazione di Calcolatori: la ricorsione 34
• Esecuzione:
Recommended