Sei sulla pagina 1di 9

1

Corso di Programmazione I
La ricorsione
Riferimenti
n Fondamenti di Informatica I
Parte II, capitolo IX: 1, 2, 4, 5, 6
2
La ricorsione
n Il concetto di ricorsione in informatica si
riconduce a quello di induzione matematica
Sia P un predicato sullinsieme N dei numeri
naturali e sia vero il predicato P(0); se per ogni
K intero, dal predicato P(k) discende la verit
di P(k+1) allora P(n) vero per qualsiasi n.
Ricorsione
n La dimostrazione in forma induttiva viene dunque
svolta secondo i seguenti passi:
passo base dellinduzione: dimostrare P(0)=vero;
passo induttivo: dimostrare che per ogni k>0
P(k) P(k+1)
n Cos come nel principio di induzione la verit di
P(k+1) discende dalla verit dello stesso predicato
P(k), il calcolo di un funzione ricorsiva avviene
mediante il calcolo della stessa funzione in un
passo successivo
3
Esempio
n Si vuole dimostrare per induzione
che:
n Base di induzione:
n Ipotesi di induzione: per ogni n>0 e
vero che:
n Dimostrazione:
S n
i n
i
n
( ) = =
+
=
2 2 1
1
0
S
i
i
( ) 0 2 2 1
1
0
0
= =
=

= =

=
n
i
i
n S
0
2 ) (

=
+
1
0
2 2
n
i
n i
1 2 1 2 * 2 2 1 2
1
= = + =
+ n n n n

=
= =
1
0
1 2 2 ) 1 (
n
i
n i
n S
Ricorsione
n Il calcolo ricorsivo consiste nel calcolare una
funzione attraverso se stessa.
n Esempio: la funzione fattoriale n! (per interi
non negativi
a) 0! = 1
b) se n>0 allora n! = n*(n-1)!
4
Ricorsione
n In altre parole, la potenza della ricorsione
nasce dalla possibilit di definire un insieme
infinito di oggetti con regola finita.
n ...allo stesso modo, un insieme infinito di
computazioni pu essere descritto con un
programma ricorsivo finito.
Algoritmi ricorsivi
Sono caratterizzati da:
- Una funzione generatrice
) (
1 i i
x g x =
+
che produce una sequenza x
1
, x
2
, ..., x
n
- Un predicato p=p(x
i
) vero per x=x
n
- Una funzione f(x) detta ricorsiva tale che
)] ( ), ( [ ) (
1 +
=
i i i
x f x h c x f
f x f
n
= ) (
5
Algoritmi ricorsivi
Il calcolo della funzione ricorsiva quindi si riconduce a
-Generazione della sequenza x
1
, x
2
, ..., x
n
- Calcolo di
- Calcolo di
1 .. )] ( ), ( [ ) (
1
n i per x f x h c x f
i i i
= =
+
f x f
n
= ) (
Schema di algoritmi ricorsivi
Sono codificati mediante un sottoprogramma che
richiama se stesso
P (T1 x) {
...
if p(x) F;
else C(S,P);
R
}
int fatt(int x){
int f;
if (x<=1) f=1;
else f=x*fatt(x-1);
return f;
}
Esempio:La funzione fattoriale n! (per interi non negativi)
a) 0! = 1
b) se n>1 allora n! = n*(n-1)!
6
Terminazione
n La chiamata ricorsiva deve quindi essere
subordinata ad una condizione che ad un
certo istante risulti non soddisfatta (il
predicato p)
n Il numero di chiamate necessarie viene
detto profondit della ricorsione
Schema ricorsivo
main
...
...
..fatt(3)
fatt(2)
if (x<=1)
f=1;
else
f=x*fatt(x-1);
return f;
fatt(1)
if (x<=1)
f=1;
else
f=x*fatt(x-1);
return f;
1
2
6
Fase discendente
Fase ascendente
fatt(3)
if (x<=1)
f=1;
else
f=x*fatt(x-1);
return f;
7
n Un sottoprogramma ricorsivo un
sottoprogramma che richiama direttamente o
indirettamente se stesso.
n Non tutti i linguaggi realizzano il meccanismo della
ricorsione.
n Quelli che lo realizzano possono utilizzare due
tecniche:
gestione LIFO di pi copie della stessa funzione,
ciascuna con il proprio insieme di var. locali;
gestione mediante record di attivazione: ununica copia
del sottoprogramma ma ad ogni chiamata associato
un record di attivazione (var.locali e punto di ritorno).
Meccanismo interno di ricorsione
Dalla forma ricorsiva a quella iterativa
Un problema ricorsivo pu essere risolto in termini
iterativi.
Nel caso in cui la ricorsione in coda, la
trasformazione molto semplice
P (T1 x) {
...
if p(x) F;
else {S;P(x);}
return
}
while !p(x)
S;
F;
Schema di trasformazione
8
Esempio: calcolo del fattoriale
int fatt(const int x){
int f;
if (x<=1) f=1;
else f=x*fatt(x-1);
return f;
}
int fatt(const int x){
int f=1,i;
for(i=1;i<=x;i++)
f=f*i;
return f;
}
Forma ricorsiva Forma iterativa
Ricorsione e iterazione
n Uso di un costrutto
di iterazione
n Condizione di
terminazione
n Loop infinito
A differenza delliterazione, la ricorsione richiede un
notevole sovraccarico (overhead) a tempo desecuzione
dovuto alle chiamate di funzione.
Dato che un programma ricorsivo pu essere sempre
trasformato in un programma iterativo, perch usare la
ricorsione?
n Uso di un costrutto
di selezione
n Condizione di
terminazione
n Non convergenza
9
Quando usare/non usare la ricorsione
n Algoritmi che per loro natura sono ricorsivi piuttosto che
iterativi dovrebbero essere formulati con procedure
ricorsive.
n Ad esempio,alcune strutture dati sono inerentemente
ricorsive:
Strutture ad albero
Sequenze
..
n e la formulazione ricorsiva di algoritmi su di esse risulta pi
naturale.
n La ricorsione deve essere evitata quando esiste una
soluzione iterativa ovvia e in situazioni in cui le prestazioni
del sistema sono un elemento critico