34
G. Amodeo, C. Gaibisso Programmazione di Programmazione di Calcolatori Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

Embed Size (px)

Citation preview

Page 1: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso Programmazione di Programmazione di

CalcolatoriCalcolatori

Lezione XXVIILa ricorsione

Programmazione di Calcolatori: la ricorsione 1

Page 2: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La 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

Page 3: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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:

Page 4: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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 =

Page 5: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 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

Page 6: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le funzioni ricorsiveLe funzioni ricorsive

Programmazione di Calcolatori: la ricorsione 6

• Esecuzione:

Page 7: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 8: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le funzioni ricorsiveLe funzioni ricorsive

Programmazione di Calcolatori: la ricorsione 8

• Esecuzione:

Page 9: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 10: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 11: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 12: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 13: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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);};

Page 14: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 14

• Esecuzione:

Page 15: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 16: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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,

Page 17: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 17

• Esecuzione:

Page 18: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 19: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 20: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 20

• Esecuzione:

Page 21: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 21

• Esecuzione:

Page 22: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 23: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 24: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 24

• Esecuzione:

Page 25: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 25

• Esecuzione:

Page 26: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 27: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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)); };

Page 28: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 28

• Esecuzione:

Page 29: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 29

• Esecuzione:

Page 30: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 31: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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

Page 32: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

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));

};

Page 33: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 33

• Esecuzione:

Page 34: G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXVII La ricorsione Programmazione di Calcolatori: la ricorsione 1

G. Amodeo,C. Gaibisso

Le strutture ricorsiveLe strutture ricorsive

Programmazione di Calcolatori: la ricorsione 34

• Esecuzione: