Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. ·...

158
Informatica B, AA 18/19, Luca Cassano Funzioni ricorsive Informatica B AA 18/19 Luca Cassano [email protected] 3 Dicembre 2018

Transcript of Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. ·...

Page 1: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Funzioni ricorsive

Informatica B AA 18/19

Luca Cassano

[email protected]

3 Dicembre 2018

Page 2: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Richiami sulle funzioni

Page 3: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Page 4: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Parametro formale in ingresso

Parametro formale in uscita

Definizione di 𝒏!Il fattoriale di un intero 𝑛 > 0 è definito come segue:

𝑛! = 𝑛 ∗ 𝑛 − 1 ∗ 𝑛 − 2 ∗ ⋯∗ 2 ∗ 1

Page 5: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

fattoriale(2)

ans =

2

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Page 6: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

fattoriale(2)

ans =

2

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Parametro attuale in ingresso

Parametro attuale in uscita

Page 7: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

k = 2;

f2 = fattoriale(k);

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Workspace principale Workspace locale

• Da qui si invoca la funzione

• Contiene le variabili k, f2

• Non ha visibilità di f,ii,n

• Creato al momento

dell’invocazione di fattoriale

• Contiene le variabili n, f,ii

• Non ha visibilità su k ed f2

• Non ha legami con il workspace

principale se non per i parametri

attuali che vengono copiati

• Distrutto terminata l’esecuzione

Page 8: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

k = 2;

f2 = fattoriale(k);

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Workspace principale Workspace locale

• Da qui si invoca la funzione

• Contiene le variabili k, f2

• Non ha visibilità di f,ii,n

• Creato al momento

dell’invocazione di fattoriale

Page 9: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

k = 2;

f2 = fattoriale(k);

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Workspace principale Workspace locale

• Da qui si invoca la funzione

• Contiene le variabili k, f2

• Non ha visibilità di f,ii,n

• Creato al momento

dell’invocazione di fattoriale

• Contiene le variabili n, f, ii

Page 10: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

k = 2;

f2 = fattoriale(k);

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Workspace principale Workspace locale

• Da qui si invoca la funzione

• Contiene le variabili k, f2

• Non ha visibilità di f,ii,n

• Creato al momento

dell’invocazione di fattoriale

• Contiene le variabili n, f, ii

• Non ha visibilità su k ed f2

Page 11: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

k = 2;

f2 = fattoriale(k);

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Workspace principale Workspace locale

• Da qui si invoca la funzione

• Contiene le variabili k, f2

• Non ha visibilità di f,ii,n

• Creato al momento

dell’invocazione di fattoriale

• Contiene le variabili n, f, ii

• Non ha visibilità su k ed f2

• Non ha legami con il workspace

principale se non per i parametri

attuali che vengono copiati (sia in

ingresso che in uscita)

Page 12: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

k = 2;

f2 = fattoriale(k);

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

Workspace principale Workspace locale

• Da qui si invoca la funzione

• Contiene le variabili k, f2

• Non ha visibilità di f,ii,n

• Creato al momento

dell’invocazione di fattoriale

• Contiene le variabili n, f, ii

• Non ha visibilità su k ed f2

• Non ha legami con il workspace

principale se non per i parametri

attuali che vengono copiati (sia in

ingresso che in uscita)

• Distrutto terminata l’esecuzione

Page 13: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempi

f2 = fattoriale(2)

f2 =

2

f3 = fattoriale(3)

f3 =

6

f4 = fattoriale(4)

f4 =

24

f5 = fattoriale(5)

f5 =

120

f6 = fattoriale(6)

f6 =

720

Page 14: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

x = f(2)

x =

2

function xx = f(yy)

……

z = g(yy);

xx = 2 * z;

end

function zz = g(kk)

zz = kk / 3;

end

Page 15: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

x = f(2)

x =

2

function xx = f(yy)

……

z = g(yy);

xx = 2 * z;

end

function zz = g(kk)

zz = kk / 3;

end

Page 16: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

x = f(2)

x =

2

function xx = f(yy)

……

z = g(yy);

xx = 2 * z;

end

function zz = g(kk)

zz = kk / 3;

end

Page 17: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

x = f(2)

x =

2

function xx = f(yy)

……

z = g(yy);

xx = 2 * z;

end

function zz = g(kk)

zz = kk / 3;

end

Page 18: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio di chiamata

x = f(2)

x =

2

function xx = f(yy)

……

z = g(yy);

xx = 2 * z;

end

function zz = g(kk)

zz = kk / 3;

end

Page 19: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio

Si dimostra immediatamente dalla definizione di fattoriale

𝑛! = 𝑛 ∗ 𝑛 − 1 ∗ 𝑛 − 2 ∗ ⋯∗ 2 ∗ 1

Vale la seguente relazione

𝑛! = 𝑛 ∗ 𝑛 − 1 !

𝑛 − 1 !

Page 20: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Un esempio

Si dimostra immediatamente dalla definizione di fattoriale

𝑛! = 𝑛 ∗ 𝑛 − 1 ∗ 𝑛 − 2 ∗ ⋯∗ 2 ∗ 1

Vale la seguente relazione

𝑛! = 𝑛 ∗ 𝑛 − 1 !

È possibile usare questa proprietà per definire

un’implementazione di fattoriale totalmente diversa?

𝑛 − 1 !

Page 21: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Funzioni che chiamano se stesse

Page 22: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

Page 23: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

• Un sottoprogramma P richiama se stesso

(ricorsione diretta)P

Page 24: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

• Un sottoprogramma P richiama se stesso

(ricorsione diretta)

• Un sottoprogramma P richiama un

sottoprogramma Q che comporta un’altra

chiamata a P (ricorsione indiretta)

P

P

Q

Page 25: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

• Un sottoprogramma P richiama se stesso

(ricorsione diretta)

• Un sottoprogramma P richiama un

sottoprogramma Q che comporta un’altra

chiamata a P (ricorsione indiretta)

È una tecnica di programmazione molto potente

P

P

Q

Page 26: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

• Un sottoprogramma P richiama se stesso

(ricorsione diretta)

• Un sottoprogramma P richiama un

sottoprogramma Q che comporta un’altra

chiamata a P (ricorsione indiretta)

È una tecnica di programmazione molto potente

Permette di risolvere in maniera elegante problemi

complessi

P

P

Q

Page 27: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

• Un sottoprogramma P richiama se stesso

(ricorsione diretta)

• Un sottoprogramma P richiama un

sottoprogramma Q che comporta un’altra

chiamata a P (ricorsione indiretta)

È una tecnica di programmazione molto potente

Permette di risolvere in maniera elegante problemi

complessi

Le funzioni che richiamano se stesse (direttamente o

indirettamente) sono dette funzioni ricorsive

P

P

Q

Page 28: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio: il fattoriale Ricorsivo

function [f] = factRic(n)

if (n == 0)

f = 1;

else

f = n * factRic(n - 1);

end

Page 29: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

29

Esempio: il fattoriale Ricorsivo

function [f] = factRic(n)

if (n == 0)

f = 1;

else

f = n * factRic(n - 1);

end

Questa ci ricorda

0! = 1

Page 30: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

30

Esempio: il fattoriale Ricorsivo

function [f] = factRic(n)

if (n == 0)

f = 1;

else

f = n * factRic(n - 1);

end

Questa ci ricorda

𝑛! = 𝑛 ∗ 𝑛 − 1 !

Page 31: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

31

Esempio: il fattoriale Ricorsivo

function [f] = factRic(n)

if (n == 0)

f = 1;

else

f = n * factRic(n - 1);

end

Una funzione che chiama se stessa

Page 32: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Una Funzione che Chiama se Stessa?

In ogni istante possono essere in corso diverse

attivazioni (istanze) dello stesso sottoprogramma

32

Page 33: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Una Funzione che Chiama se Stessa?

In ogni istante possono essere in corso diverse

attivazioni (istanze) dello stesso sottoprogramma

• Ovviamente sono tutte sospese tranne una, l'ultima

invocata, all'interno della quale si sta svolgendo il

flusso di esecuzione.

33

Page 34: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Una Funzione che Chiama se Stessa?

In ogni istante possono essere in corso diverse

attivazioni (istanze) dello stesso sottoprogramma

• Ovviamente sono tutte sospese tranne una, l'ultima

invocata, all'interno della quale si sta svolgendo il

flusso di esecuzione.

Ogni attivazione esegue lo stesso codice ma opera su

workspace distinti (in Matlab, ogni funzione attivata ha

un workspace distinto)

34

Page 35: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Una Funzione che Chiama se Stessa?

In ogni istante possono essere in corso diverse

attivazioni (istanze) dello stesso sottoprogramma

• Ovviamente sono tutte sospese tranne una, l'ultima

invocata, all'interno della quale si sta svolgendo il

flusso di esecuzione.

Ogni attivazione esegue lo stesso codice ma opera su

workspace distinti (in Matlab, ogni funzione attivata ha

un workspace distinto)

• Si hanno quindi copie distinte dei parametri attuali e

delle variabili locali nelle varie invocazioni

35

Page 36: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Una funzione che chiama se stessa?

… se ogni volta la funzione richiama se stessa… perché la catena di invocazioni non continua all'infinito?

36

Page 37: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Una funzione che chiama se stessa?

… se ogni volta la funzione richiama se stessa… perché la catena di invocazioni non continua all'infinito?

La funzione ricorsiva deve prevedere una situazione in cui non richiama se stessa, i.e., il caso base

37

Page 38: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

38

Programmazione Ricorsiva

Per risolvere un problema attraverso la programmazione

ricorsiva sono necessari alcuni elementi

Page 39: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

39

Programmazione Ricorsiva

Per risolvere un problema attraverso la programmazione

ricorsiva sono necessari alcuni elementi

• Caso base: caso elementare del problema che può

essere risolto immediatamente. Il caso base non deve

eseguire alcuna chiamata ricorsiva.

Page 40: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

40

Programmazione Ricorsiva

Per risolvere un problema attraverso la programmazione

ricorsiva sono necessari alcuni elementi

• Caso base: caso elementare del problema che può

essere risolto immediatamente. Il caso base non deve

eseguire alcuna chiamata ricorsiva.

• Passo ricorsivo: chiamata ricorsiva per risolvere uno o

più problemi più semplici

Page 41: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

41

Programmazione Ricorsiva

Per risolvere un problema attraverso la programmazione

ricorsiva sono necessari alcuni elementi

• Caso base: caso elementare del problema che può

essere risolto immediatamente. Il caso base non deve

eseguire alcuna chiamata ricorsiva.

• Passo ricorsivo: chiamata ricorsiva per risolvere uno o

più problemi più semplici

• Costruzione della soluzione: costruzione della

soluzione sulla base del risultato delle chiamate

ricorsive

Page 42: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

42

Programmazione Ricorsiva

Per risolvere un problema attraverso la programmazione

ricorsiva sono necessari alcuni elementi

• Caso base: caso elementare del problema che può

essere risolto immediatamente. Il caso base non deve

eseguire alcuna chiamata ricorsiva.

• Passo ricorsivo: chiamata ricorsiva per risolvere uno o

più problemi più semplici

• Costruzione della soluzione: costruzione della

soluzione sulla base del risultato delle chiamate

ricorsive

Affinché l’esecuzione della funzione

termini è fondamentale che la soluzione

ricorsiva converga verso il caso base

Page 43: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

43

Esempio: il fattoriale

Definizione:

f(n) = n! = n*(n-1)*(n-2)*…*3*2*1

Definire caso base, e passo ricorsivo

Page 44: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

44

Esempio: il fattoriale

Definizione:

f(n) = n! = n*(n-1)*(n-2)*…*3*2*1

Passo ricorsivo:

f(n) = n*f(n-1)

Caso base:

f(0)=1

Page 45: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

45

Esempio: il fattoriale

Definizione:

f(n) = n! = n*(n-1)*(n-2)*…*3*2*1

Passo ricorsivo:

f(n) = n*f(n-1)

Caso base:

f(0)=1function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

Page 46: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

46

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRicfactRic(3)

Page 47: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

47

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRic

n:2 f: ...factRic

factRic(3)

Page 48: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

48

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRic

n:2 f: ...factRic

n:1 f: ...factRic

factRic(3)

Page 49: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

49

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRic

n:2 f: ...factRic

n:1 f: ...factRic

n:0 f: ...factRic

factRic(3)

Page 50: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

50

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRic

n:2 f: ...factRic

n:1 f: ...factRic

n:0 f: 1factRic

factRic(3)

Page 51: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

51

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRic

n:2 f: ...factRic

n:1 f: ...factRic

n:0 f: 1factRic

factRic(3)

Page 52: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

52

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRic

n:2 f: ...factRic

n:1 f: 1factRic

factRic(3)

Page 53: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

53

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: ...factRic

n:2 f: 2factRic

factRic(3)

Page 54: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

54

Funzionamento ricorsione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

n:3 f: 6factRicfactRic(3)

ans =

6

Page 55: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione in Coda

Ricorsione in cui la funzione:

• prevede una sola chiamata ricorsiva

• esegue la chiamata ricorsiva come ultima istruzione

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

55

Page 56: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

56

Problemi nell’Uso della Ricorsione

Terminazione della catena ricorsiva

• È presente il caso base?

• Viene raggiunto sempre dalla catena di chiamate

ricorsive?

Page 57: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Errori nell’Uso della Ricorsione

Catena infinita di chiamate incondizionate

• Deve esistere una condizione tale per cui non viene

eseguita la chiamata ricorsiva (caso base)

function [f]=factRic(n)

f=n*factRic(n-1);

57

Page 58: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Errori nell’Uso della Ricorsione

Catena infinita di chiamate incondizionate

• Deve esistere una condizione tale per cui non viene

eseguita la chiamata ricorsiva (caso base)

Es la chiamata a factRic(7) chiama factRic(7),

che chiama factRic(6),

che chiama factRic(5),

che chiama factRic(4),

che chiama factRic(3),….

che chiama factRic(-1000),….

function [f]=factRic(n)

f=n*factRic(n-1);

58

Page 59: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Errori nell’Uso della Ricorsione

Catena infinita di chiamate incondizionate

• è necessario che questa condizione venga

raggiunta: anche programmi formalmente corretti

potrebbero non funzionare per alcuni valori degli

ingressi

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

59

Page 60: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Errori nell’Uso della Ricorsione

Catena infinita di chiamate incondizionate

• è necessario che questa condizione venga

raggiunta: anche programmi formalmente corretti

potrebbero non funzionare per alcuni valori degli

ingressi

• Ad es, factRic(-1) da luogo ad una sequenza di

chiamate infinite

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n-1);

end

60

Page 61: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Errori nell’Uso della Ricorsione

Catena infinita di chiamate identiche:

• La chiamata ricorsiva non può avere i parametri

formali uguali a quelli attuali

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n);

end

61

Page 62: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Errori nell’Uso della Ricorsione

Catena infinita di chiamate identiche:

• La chiamata ricorsiva non può avere i parametri

formali uguali a quelli attuali

Es la chiamata a factRic(7) chiama factRic(7),

che chiama factRic(7),

che chiama factRic(7),

che chiama factRic(7),

che chiama factRic(7),….

function [f]=factRic(n)

if (n==0)

f=1;

else

f=n*factRic(n);

end

62

Page 63: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Di Default…

Matlab si blocca le chiamate ricorsive dopo un po’

>> factRic(600)

Out of memory. The likely cause is an infinite

recursion within the program.

Error in fatRic at line XXX

dove XXX indica la riga in cui compare la chiamata ricorsiva

63

Page 64: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Condizioni Necessarie

.. Per evitare ricorsione infinita:

Occorre che le chiamate ricorsive siano soggette a una condizione che prima o poi assicura che la catena termini

Occorre anche che l'argomento sia progressivamente modificato dal passo ricorsivo, in modo da tendere prima o poi al caso base• Nella pratica l’argomento si avvicina al valore nel caso

base

64

Page 65: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

65

Page 66: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

end

66

Page 67: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

if

else

end

end

67

Page 68: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

if a == b

else

end

end

68

Page 69: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

if a == b

somma = a;

disp(['caso base somma vale ' , num2str(somma)]);

else

end

end

69

Page 70: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

if a == b

somma = a;

disp(['caso base somma vale ' , num2str(somma)]);

else

disp(['prima chiamata a = ' ,num2str(a)]);

somma = a + sommaNumeriCompresi(a+1 , b);

disp(['dopo chiamata a = ' ,num2str(a)]);

end

end

70

Page 71: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

71

Esempio

b:6 somma: ...sommaNumeriCompresi(3 ,6) a:3

Page 72: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

72

Esempio

b:6 somma: ...sommaNumeriCompresi(3 ,6) a:3

b:6 somma: ...a:4sommaNumeriCompresi(4 ,6)

Page 73: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

73

Esempio

b:6 somma: ...sommaNumeriCompresi(3 ,6) a:3

b:6 somma: ...a:4

b:6 somma: ...a:5

sommaNumeriCompresi(4 ,6)

sommaNumeriCompresi(5 ,6)

Page 74: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

74

Esempio

b:6 somma: ...sommaNumeriCompresi(3 ,6) a:3

b:6 somma: ...a:4

b:6 somma: ...a:5

b:6 somma: ...a:6

sommaNumeriCompresi(4 ,6)

sommaNumeriCompresi(5 ,6)

sommaNumeriCompresi(6 ,6)

Page 75: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

75

Esempio

b:6 somma: ...a:3

b:6 somma: ...a:4

b:6 somma: ...a:5

b:6 somma: 6a:6

sommaNumeriCompresi(3 ,6)

sommaNumeriCompresi(4 ,6)

sommaNumeriCompresi(5 ,6)

sommaNumeriCompresi(6 ,6)

Page 76: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

76

Esempio

b:6 somma: ...a:3

b:6 somma: ...a:4

b:6 somma: ...a:5

b:6 somma: 6a:6

sommaNumeriCompresi(3 ,6)

sommaNumeriCompresi(4 ,6)

sommaNumeriCompresi(5 ,6)

sommaNumeriCompresi(6 ,6)

Page 77: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

77

Esempio

b:6 somma: ...a:3

b:6 somma: ...a:4

b:6 somma: 11a:5

sommaNumeriCompresi(3 ,6)

sommaNumeriCompresi(4 ,6)

sommaNumeriCompresi(5 ,6)

Page 78: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

78

Esempio

b:6 somma: ...a:3

b:6 somma: 15a:4

sommaNumeriCompresi(3 ,6)

sommaNumeriCompresi(4 ,6)

Page 79: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

79

Esempio

b:6 somma: 18a:3sommaNumeriCompresi(3 ,6)

Page 80: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Qual è il problema nella soluzione proposta?

80

Page 81: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Qual è il problema nella soluzione proposta?

Cosa succede se a > b?

81

Page 82: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Qual è il problema nella soluzione proposta?

Cosa succede se a > b?

Chiamate ricorsive infinite

82

Page 83: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

if b< a

somma = 0;

end

if a == b

somma = a;

disp(['caso base somma vale ' , num2str(somma)]);

else

disp(['prima chiamata a = ' ,num2str(a)]);

somma = a + sommaNumeriCompresi(a+1 , b);

disp(['dopo chiamata a = ' ,num2str(a)]);

end

83

Page 84: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

if b< a

somma = 0;

end

if a == b

somma = a;

disp(['caso base somma vale ' , num2str(somma)]);

else

disp(['prima chiamata a = ' ,num2str(a)]);

somma = a + sommaNumeriCompresi(a+1 , b);

disp(['dopo chiamata a = ' ,num2str(a)]);

end

84

Errore! Non è un caso

base perchè dopo

questo if viene

comunque eseguita la

chiamata ricorsiva

Page 85: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

if b< a

somma = 0;

return;

end

if a == b

somma = a;

disp(['caso base somma vale ' , num2str(somma)]);

else

disp(['prima chiamata a = ' ,num2str(a)]);

somma = a + sommaNumeriCompresi(a+1 , b);

disp(['dopo chiamata a = ' ,num2str(a)]);

end

85

In questo modo l’esecuzione

termina e abbiamo un caso

base corretto.

Page 86: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva che calcola la somma di tutti

gli interi compresi tra due argomenti passati come parametri

function somma = sommaNumeriCompresi(a ,b)

a = min([a, b]);

b = max([a, b]);

if a == b

somma = a;

disp(['caso base somma vale ' , num2str(somma)]);

else

disp(['prima chiamata a = ' ,num2str(a)]);

somma = a + sommaNumeriCompresi(a+1 , b);

disp(['dopo chiamata a = ' ,num2str(a)]);

end

86

Page 87: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Le ninfee

Uno stagno contiene n ninfee

• Ogni ninfea in 1 giorno si riproduce di un fattore f (se

f == 2 ogni ninfea ogni giorno genera un’altra ninfea,

se f == 3 ogni ninfea ogni giorno genera due ninfee…)

Scrivere una funzione ricorsiva per calcolare in quanti

giorni la popolazione iniziale di n ninfee ha raggiunto una

cardinalità di N individui dato un fattore f fissato

Page 88: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Soluzione

function gg = stagno(n, f, N)

end

Page 89: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Soluzione

function gg = stagno(n, f, N)

% caso base: se ho già N ninfee nello stagno

% non devo aspettare alcun giorno

if

else

end

end

Page 90: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Soluzione

function gg = stagno(n, f, N)

% caso base: se ho già N ninfee nello stagno

% non devo aspettare alcun giorno

if (n >= N)

gg = 0;

else

end

end

Page 91: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Soluzione

function gg = stagno(n, f, N)

% caso base: se ho già N ninfee nello stagno

% non devo aspettare alcun giorno

if (n >= N)

gg = 0;

else

% non abbiamo ancora N ninfee -> chiamata ricorsiva:

% il numero di giorni necessari per coprire lo stagno è

% uguale a: un giorno +

% il numero di giorni che saranno necessari domani

% (quando le ninfee saranno diventate n*f).

end

end

Page 92: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Soluzione

function gg = stagno(n, f, N)

% caso base: se ho già N ninfee nello stagno

% non devo aspettare alcun giorno

if (n >= N)

gg = 0;

else

% non abbiamo ancora N ninfee -> chiamata ricorsiva:

% il numero di giorni necessari per coprire lo stagno è

% uguale a: un giorno +

% il numero di giorni che saranno necessari domani

% (quando le ninfee saranno diventate n*f).

gg = 1 + stagno(n * f, f, N);

end

end

Page 93: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva per calcolare la lunghezza di

una stringa

93

Page 94: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva per calcolare la lunghezza di

una stringa

function s = calcolaLunghezza(str)

end

94

Page 95: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva per calcolare la lunghezza di

una stringa

function s = calcolaLunghezza(str)

if

else

end

end

95

Page 96: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva per calcolare la lunghezza di

una stringa

function s = calcolaLunghezza(str)

if(isempty(str))

s = 0;

else

end

end

96

Page 97: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva per calcolare la lunghezza di

una stringa

function s = calcolaLunghezza(str)

if(isempty(str))

s = 0;

else

s = 1 + calcolaLunghezza(str(2 : end));

end

end

97

Page 98: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

98

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

Page 99: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

99

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iaocalcolaLunghezza(‘iao’)

Page 100: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

100

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iao

s: ...str: ao

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

Page 101: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

101

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iao

s: ...str: ao

s: ...str: o

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

calcolaLunghezza(‘o’)

Page 102: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

102

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iao

s: ...str: ao

s: ...str: o

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

calcolaLunghezza(‘o’)

s: ...str:calcolaLunghezza(‘’)

Page 103: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

103

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iao

s: ...str: ao

s: ...str: o

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

calcolaLunghezza(‘o’)

s: 0str:calcolaLunghezza(‘’)

Page 104: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

104

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iao

s: ...str: ao

s: ...str: o

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

calcolaLunghezza(‘o’)

s: 0str:calcolaLunghezza(‘’)

Page 105: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

105

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iao

s: ...str: ao

s: 1str: o

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

calcolaLunghezza(‘o’)

Page 106: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

106

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: ...str: iao

s: 2str: ao

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

Page 107: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

107

Esempio

s: ...calcolaLunghezza(‘ciao’) str: ciao

s: 3str: iaocalcolaLunghezza(‘iao’)

Page 108: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

108

Esempio

s: 4calcolaLunghezza(‘ciao’) str: ciao

Page 109: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione per stampare una stringa al contrario

109

Page 110: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Scrivere una funzione per stampare una stringa al contrario

function stampaAlContrario(frase)

% caso base

if

else

end

end

110

Page 111: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Scrivere una funzione per stampare una stringa al contrario

function stampaAlContrario(frase)

% caso base

if isempty(frase)

else

end

end

111

Page 112: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Scrivere una funzione per stampare una stringa al contrario

function stampaAlContrario(frase)

% caso base

if isempty(frase)

% return

else

end

end

112

Page 113: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Scrivere una funzione per stampare una stringa al contrario

function stampaAlContrario(frase)

% caso base

if isempty(frase)

% return

else

disp(frase(end)); % stampa al contrario

end

end

113

Page 114: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Scrivere una funzione per stampare una stringa al contrario

function stampaAlContrario(frase)

% caso base

if isempty(frase)

% return

else

disp(frase(end)); % stampa al contrario

% chiamata ricorsiva

stampaAlContrario(frase(1:end-1))

end

end

114

Page 115: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

115

Esempio

disp(‘o’)stampaAlContrario(‘ciao’) str: ciao

Page 116: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

116

Esempio

disp(‘o’)stampaAlContrario(‘ciao’) str: ciao

disp(‘a’)str: ciastampaAlContrario(‘cia’)

Page 117: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

117

Esempio

disp(‘o’)stampaAlContrario(‘ciao’) str: ciao

disp(‘a’)str: cia

disp(‘i’)str: ci

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

Page 118: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

118

Esempio

disp(‘o’)stampaAlContrario(‘ciao’) str: ciao

disp(‘a’)str: cia

disp(‘i’)str: ci

disp(‘c’)str: c

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

stampaAlContrario(‘c’)

Page 119: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

119

Esempio

disp(‘’)str:stampaAlContrario(‘’)

disp(‘o’)stampaAlContrario(‘ciao’) str: ciao

disp(‘a’)str: cia

disp(‘i’)str: ci

disp(‘c’)str: c

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

stampaAlContrario(‘c’)

Page 120: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Modificare la funzione precedente per stampare la stringa

nello stesso ordine in cui è stata inserita

120

Page 121: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Modificare la funzione precedente per stampare la stringa

nello stesso ordine in cui è stata inserita

function stampaAlContrario(frase)

% caso base

if isempty(frase)

% return

else

% chiamata ricorsiva

stampaAlContrario(frase(1:end-1))

disp(frase(end)); % stampa dritto

end

In questo caso la

ricorsione non è

in coda

121

Page 122: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

122

Esempio

stampaAlContrario(‘ciao’) str: ciao

Page 123: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

123

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: ciastampaAlContrario(‘cia’)

Page 124: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

124

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

Page 125: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

125

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

str: c

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

stampaAlContrario(‘c’)

Page 126: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

126

Esempio

str:stampaAlContrario(‘’)

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

str: c

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

stampaAlContrario(‘c’)

Page 127: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

127

Esempio

str:stampaAlContrario(‘’)

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

str: c

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

stampaAlContrario(‘c’)

Page 128: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

128

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

disp(‘c’)str: c

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

stampaAlContrario(‘c’)

Page 129: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

129

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’) disp(‘i’)

Page 130: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

130

Esempio

stampaAlContrario(‘ciao’) str: ciao

disp(‘a’)str: ciastampaAlContrario(‘cia’)

Page 131: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

131

Esempio

disp(‘o’)stampaAlContrario(‘ciao’) str: ciao

Page 132: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Cosa stampa??

function stampa(frase)

% caso base

if isempty(frase)

% return

else

stampa(frase(2:end))

disp(frase(1));

end

132

Page 133: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio:

Cosa stampa??

function stampa(frase)

% caso base

if isempty(frase)

% return

else

stampa(frase(2:end))

disp(frase(1));

end

133

>> stampa(‘ciao’);

>> o

>> a

>> i

>> c

Page 134: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampa(str)

if(isempty(str))

% return

else

disp(str(end));

stampaAlContrario(str(1 : end -1));

disp(str(end));

end

Page 135: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampaAlContrario(str)

if(isempty(str))

% return

else

disp(str(end));

stampaAlContrario(str(1 : end -1));

disp(str(end));

end

>> stampaAlContrario('ciao')

o

a

i

c

c

i

a

o

Page 136: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampaAlContrario(str)

if(isempty(str))

% return

else

disp(str(end));

stampaAlContrario(str(2 : end));

disp(str(end));

end

Page 137: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampaAlContrario(str)

if(isempty(str))

% return

else

disp(str(end));

stampaAlContrario(str(2 : end));

disp(str(end));

end

>> stampaAlContrario('ciao')

o

o

o

o

o

o

o

o

Page 138: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampaAlContrario(str)

if(isempty(str))

% return

else

disp(str(1));

stampaAlContrario(str(2 : end));

disp(str(1));

end

Page 139: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampaAlContrario(str)

if(isempty(str))

% return

else

disp(str(1));

stampaAlContrario(str(2 : end));

disp(str(1));

end

>> stampaAlContrario('ciao')

c

i

a

o

o

a

i

c

Page 140: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampaAlContrario(str)

if(isempty(str))

% return

else

disp(str(1));

stampaAlContrario(str(1 : end -1));

disp(str(1));

end

Page 141: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Cosa Stampa?

function stampaAlContrario(str)

if(isempty(str))

% return

else

disp(str(1));

stampaAlContrario(str(1 : end -1));

disp(str(1));

end

>> stampaAlContrario('ciao')

c

c

c

c

c

c

c

c

Page 142: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

145

I numeri di Fibonacci

• Modello alla base di molte dinamiche evolutive delle

popolazioni

F = {f0, ..., fn}

• f0 = 1

• f1 = 1

• Per n > 1, fn = fn–1 + fn–2

Definizione ricorsiva della successione di Fibonacci

Page 143: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

146

I numeri di Fibonacci

• Modello a base di molte dinamiche evolutive delle

popolazioni

F = {f0, ..., fn}

• f0 = 1

• f1 = 1

• Per n > 1, fn = fn–1 + fn–2

casi base (sono 2!)

Definizione ricorsiva della successione di Fibonacci

Page 144: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

147

I numeri di Fibonacci

• Modello a base di molte dinamiche evolutive delle

popolazioni

F = {f0, ..., fn}

• f0 = 1

• f1 = 1

• Per n > 1, fn = fn–1 + fn–2

casi base (sono 2!)

1 passo ricorsivo

Definizione ricorsiva della successione di Fibonacci

Page 145: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

148

I numeri di Fibonacci

• Modello a base di molte dinamiche evolutive delle

popolazioni

F = {f0, ..., fn}

• f0 = 1

• f1 = 1

• Per n > 1, fn = fn–1 + fn–2

casi base (sono 2!)

1 passo ricorsivo

Definizione ricorsiva della successione di Fibonacci

F(3)

Page 146: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

149

I numeri di Fibonacci

• Modello a base di molte dinamiche evolutive delle

popolazioni

F = {f0, ..., fn}

• f0 = 1

• f1 = 1

• Per n > 1, fn = fn–1 + fn–2

casi base (sono 2!)

1 passo ricorsivo

Definizione ricorsiva della successione di Fibonacci

F(3)

F(2) F(1)

+

Page 147: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

150

I numeri di Fibonacci

• Modello a base di molte dinamiche evolutive delle

popolazioni

F = {f0, ..., fn}

• f0 = 1

• f1 = 1

• Per n > 1, fn = fn–1 + fn–2

casi base (sono 2!)

1 passo ricorsivo

Definizione ricorsiva della successione di Fibonacci

F(3)

F(2) F(1)

+

F(1) F(0)

+

1

Page 148: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

151

I numeri di Fibonacci

• Modello a base di molte dinamiche evolutive delle

popolazioni

F = {f0, ..., fn}

• f0 = 1

• f1 = 1

• Per n > 1, fn = fn–1 + fn–2

casi base (sono 2!)

1 passo ricorsivo

Definizione ricorsiva della successione di Fibonacci

F(3)

F(2) F(1)

+

F(1) F(0)

+

1 1

1

Page 149: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

152

Esempio: Fibonacci

È una sequenza di numeri interi in cui ogni numero si ottiene

sommando i due precedenti nella sequenza. I primi due

numeri della sequenza sono per definizione pari ad 1.

• f1 = 1 (caso base)

• f2 = 1 (caso base)

• fn = fn-1 + fn-2 (passo ricorsivo)

Page 150: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

153

Esempio: Fibonacci

È una sequenza di numeri interi in cui ogni numero si ottiene

sommando i due precedenti nella sequenza. I primi due

numeri della sequenza sono per definizione pari ad 1.

• f1 = 1 (caso base)

• f2 = 1 (caso base)

• fn = fn-1 + fn-2 (passo ricorsivo)

function [fib]=FiboRic(n)

if n==1 | n==2

fib=1;

else

fib(n)=FiboRic(n-2)+FiboRic(n-1);

end

Page 151: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

154

Problemi nell’uso della ricorsione

Uso della memoria

• La programmazione ricorsiva comporta spesso un uso

inefficiente della memoria per la gestione degli spazi di

lavoro delle chiamate generate

• In alcuni casi (che non abbiamo il tempo di vedere) viene

comunque preferita ad altri approcci per la sua eleganza e

semplicità

• In altri casi, si può ricorrere ad implementazioni iterative

Page 152: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

155

Problemi nell’uso della ricorsione

Uso della memoria

• La programmazione ricorsiva comporta spesso un uso

inefficiente della memoria per la gestione degli spazi di

lavoro delle chiamate generate

• In alcuni casi (che non abbiamo il tempo di vedere) viene

comunque preferita ad altri approcci per la sua eleganza e

semplicità

• In altri casi, si può ricorrere ad implementazioni iterative

function [fl]=Fiblist(n)

fl(1)=1;

fl(2)=1;

for k=3:n

fl(k)=fl(k-2)+fl(k-1);

end

Funzione iterativa che calcola i

primi n numeri di fibonacci

Page 153: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione Eccessiva

Soluzione elegante ma dispendiosa: numero molto alto di

chiamate ricorsive fib(6)

fib(4) fib(5)

fib(2) fib(3)

fib(1) fib(2)

fib(3)

fib(1) fib(2)

fib(4)

fib(2) fib(3)

fib(1) fib(2)

Page 154: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione Eccessiva

Soluzione elegante ma dispendiosa: numero molto alto di

chiamate ricorsive

fib(1) viene chiamata 3 volte

fib(6)

fib(4) fib(5)

fib(2) fib(3)

fib(1) fib(2)

fib(3)

fib(1) fib(2)

fib(4)

fib(2) fib(3)

fib(1) fib(2)

Page 155: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione Eccessiva

Soluzione elegante ma dispendiosa: numero molto alto di

chiamate ricorsive

fib(2) viene chiamata 5 volte

fib(6)

fib(4) fib(5)

fib(2) fib(3)

fib(1) fib(2)

fib(3)

fib(1) fib(2)

fib(4)

fib(2) fib(3)

fib(1) fib(2)

Page 156: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Ricorsione Eccessiva

Soluzione elegante ma dispendiosa: numero molto alto di

chiamate ricorsive

Provate a far calcolare fib(10), fib(15), fib(20), fib(25),

fib(30) ....

Qante volte viene calcolato fab(3)?

Meglio usare una soluzione non ricorsiva...

fib(6)

fib(4) fib(5)

fib(2) fib(3)

fib(1) fib(2)

fib(3)

fib(1) fib(2)

fib(4)

fib(2) fib(3)

fib(1) fib(2)

Page 157: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva palindroma che controlla se

una stringa è palindroma

Page 158: Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. · Informatica B, AA 18/19, Luca Cassano 42 Programmazione Ricorsiva Per risolvere un

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva palindroma che controlla se

una stringa è palindroma

function [res]=controllaPalindromo(stringa)

% stringhe di un carattere (o vuote sono palindrome)

if length(stringa)<2

res=true;

else

% controllo se gli estremi sono uguali

if stringa(1)==stringa(end)

% in tal caso richiama controllaPalindromo su stringa(2, end-1)

res=controllaPalindromo(stringa(2:end-1));

else

res=false;

end

end