Funzioni ricorsivecassano.faculty.polimi.it/Lez11_Ricorsione_FunzioniOr... · 2018. 11. 30. ·...
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
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