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

Post on 24-Sep-2020

2 views 0 download

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

Informatica B, AA 18/19, Luca Cassano

Funzioni ricorsive

Informatica B AA 18/19

Luca Cassano

luca.cassano@polimi.it

3 Dicembre 2018

Informatica B, AA 18/19, Luca Cassano

Richiami sulle funzioni

Informatica B, AA 18/19, Luca Cassano

Un esempio

function f = fattoriale(n)

f = 1;

for ii = 2 : n

f = f * ii;

end

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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 !

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 !

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Funzioni che chiamano se stesse

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

Informatica B, AA 18/19, Luca Cassano

Ricorsione

Che cos’è la ricorsione?

• Un sottoprogramma P richiama se stesso

(ricorsione diretta)P

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

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

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

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

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

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

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 !

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

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

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

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

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

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

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

Informatica B, AA 18/19, Luca Cassano

38

Programmazione Ricorsiva

Per risolvere un problema attraverso la programmazione

ricorsiva sono necessari alcuni elementi

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.

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

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

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

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

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

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

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)

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)

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)

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)

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)

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)

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)

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)

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

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

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?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Informatica B, AA 18/19, Luca Cassano

71

Esempio

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

Informatica B, AA 18/19, Luca Cassano

72

Esempio

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

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

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)

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)

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)

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)

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)

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)

Informatica B, AA 18/19, Luca Cassano

79

Esempio

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

Informatica B, AA 18/19, Luca Cassano

Esempio

Qual è il problema nella soluzione proposta?

80

Informatica B, AA 18/19, Luca Cassano

Esempio

Qual è il problema nella soluzione proposta?

Cosa succede se a > b?

81

Informatica B, AA 18/19, Luca Cassano

Esempio

Qual è il problema nella soluzione proposta?

Cosa succede se a > b?

Chiamate ricorsive infinite

82

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

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

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.

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

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

Informatica B, AA 18/19, Luca Cassano

Soluzione

function gg = stagno(n, f, N)

end

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

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

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

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

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva per calcolare la lunghezza di

una stringa

93

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

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

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

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

Informatica B, AA 18/19, Luca Cassano

98

Esempio

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

Informatica B, AA 18/19, Luca Cassano

99

Esempio

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

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

Informatica B, AA 18/19, Luca Cassano

100

Esempio

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

s: ...str: iao

s: ...str: ao

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

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

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(‘’)

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(‘’)

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(‘’)

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

Informatica B, AA 18/19, Luca Cassano

106

Esempio

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

s: ...str: iao

s: 2str: ao

calcolaLunghezza(‘iao’)

calcolaLunghezza(‘ao’)

Informatica B, AA 18/19, Luca Cassano

107

Esempio

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

s: 3str: iaocalcolaLunghezza(‘iao’)

Informatica B, AA 18/19, Luca Cassano

108

Esempio

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

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione per stampare una stringa al contrario

109

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

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

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

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

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

Informatica B, AA 18/19, Luca Cassano

115

Esempio

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

Informatica B, AA 18/19, Luca Cassano

116

Esempio

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

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

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

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

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

Informatica B, AA 18/19, Luca Cassano

Esempio:

Modificare la funzione precedente per stampare la stringa

nello stesso ordine in cui è stata inserita

120

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

Informatica B, AA 18/19, Luca Cassano

122

Esempio

stampaAlContrario(‘ciao’) str: ciao

Informatica B, AA 18/19, Luca Cassano

123

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: ciastampaAlContrario(‘cia’)

Informatica B, AA 18/19, Luca Cassano

124

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

stampaAlContrario(‘cia’)

stampaAlContrario(‘ci’)

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

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

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

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

Informatica B, AA 18/19, Luca Cassano

129

Esempio

stampaAlContrario(‘ciao’) str: ciao

str: cia

str: ci

stampaAlContrario(‘cia’)

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

Informatica B, AA 18/19, Luca Cassano

130

Esempio

stampaAlContrario(‘ciao’) str: ciao

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

Informatica B, AA 18/19, Luca Cassano

131

Esempio

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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)

+

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

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

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)

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

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

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

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)

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)

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)

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)

Informatica B, AA 18/19, Luca Cassano

Esempio

Scrivere una funzione ricorsiva palindroma che controlla se

una stringa è palindroma

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