Ricorsione - UniCam - Computer Science Division

Transcript

Ricorsione - UniCam - Computer Science Division
Ricorsione
Rosario Culmone
- p. 1/??
Induzione e Ricorsione
Spesso utilizzeremo le definizioni induttive. Sono forme di
definizione compatte che descrivono un numero infinito di
elementi. I contesti di utilizzo sono molteplici
matematica
informatica
musica
geometria
pittura
fattoriale, successioni
ricorsione, grammatiche
barocca
frattali, chiocciole
specchi
Peano
McCarthy
Bach
Mandelbrot
Escher
Le definizioni induttive sono anche chiamate costruttive o per
induzione strutturale per mettere in evidenza che tali definizioni
si applicano ad oggetti che hanno una ben determinata
struttura che iterata produce strutture simili.
- p. 2/??
Ricorsione
In informatica spesso viene utilizzato il termine ricorsione per
indicare una definizione induttiva ovvero ’l’oggetto che si vuole
definire compare anche nell’espressione che vuole definirlo’.
La ricorsione mette in evidenza la struttura della definizione
mediante due parti:
■ Base. Il più piccolo elemento descrivibile
■ Induzione. Tutti gli altri elementi mediante costruzione.
- p. 3/??
Fattoriale
La funzione fattoriale si applica ad un naturale n e produce il
prodotto di tutti i naturali precedenti, compreso n. Ovvero
f att(4) = 4 · 3 · 2 · 1. In generale f att(n) = n · n − 1 · . . . 1. Una
definizione compatta è la seguente:
(
1
se n = 0
fatt(n) =
n · fatt(n − 1) se n > 0
Si evince che è una definizione ricorsiva dal fatto che a sinistra
e a destra dell’= compare f att. Da notare che questo fatto da
solo non implica che sia una corretta definizione ricorsiva.
- p. 4/??
Fattoriale errato
E’ facile cadere in errore nella definizione ricorsiva. Ad
esempio:
(
1
se n = 0
fatt(n) =
n · fatt(n) se n > 0
passo induttivo errato, oppure
(
0
se
fatt(n) =
n · fatt(n − 1) se
n=0
n>0
passo base errato.
- p. 5/??
Calcolo
La definizione ricorsiva non viene solo utilizzata solo per
definire funzioni o insiemi ma è pure un metodo di calcolo.
Operativavamente è possibile effettuare il calcolo del fattoriale
effettuando delle sostituzioni:
fatt(4) = 4 · fatt(3)
= 4 · 3 · fatt(2)
= 4 · 3 · 2 · fatt(1)
= 4 · 3 · 2 · 1 · fatt(0)
=4·3·2·1·1
- p. 6/??
Operatività del calcolo
Nel caso precedente abbiamo applicato la sostituzione del
caso induttivo 4 volte e del caso base 1 volta andando in
profondità a cercare il caso base lasciandoci dietro il calcolo.
Una volta raggiunto il caso base bisogna effettuare tutte le
moltiplicazioni (possibilmente in ordine inverso se si tiene
conto dell’associatività a destra). In pratica si avrebbe:
fatt(4) = 4 · fatt(3)
= 4 · 3 · fatt(2)
= 4 · 3 · 2 · fatt(1)
= 4 · 3 · 2 · 1 · fatt(0)
=4·3·2·1·1
= 4 · 3 · 2·
=4·3·2
=4·6
= 24
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
- p. 7/??
Realizzazione della ricorsione
In generale nel passo induttivo possono essere richiesti calcoli
molto complessi. Abbiamo quindi bisogno di:
■ contenitore di informazioni temporanee per ogni
applicazione del passo induttivo
■ uno strumento a fisarmonica che si gonfia in fase di
applicazione del passo induttivo e si sgonfia in fase di calcolo
In realtà il calcolo può essere in parte effettuato prima o dopo
l’applicazione del passo induttivo.
Il contenitore delle informazioni temporanee deve essere
diverso per ogni fase del passo induttivo.
- p. 8/??
La pila
Lo strumento giusto per il nostro calcolo è la PILA. La pila ha
tre operazioni:
1. P ush(e). L’operazione P ush(e) pone in cima alla pila il
contenitore e
2. P op. L’operazione P op produce quello che stà in cima alla
pila e lo toglie
3. Empty. L’operazione Empty produce il valore logico vero se
la pila è vuota.
La PILA è quello che normalmente utilizziamo: una pila di
piatti, una pila di fogli. Il vincole è che non si possono prendere
fogli in mezzo alla pila.
- p. 9/??
Calcolo con la pila
fatt(4) = 4 · fatt(3)
= 4 · 3 · fatt(2)
= 4 · 3 · 2 · fatt(1)
= 4 · 3 · 2 · 1 · fatt(0)
=4·3·2·1·1
=4·3·2·1
=4·3·2
=4·6
= 24
P ush(4)
P ush(3)
P ush(2)
P ush(1)
P ush(1)
P ush(P op · P op)
P ush(P op · P op)
P ush(P op · P op)
P ush(P op · P op)
- p. 10/??
Ricorsione e Pila
In generale la PILA può essere utilizzata per qualsiasi funzione
ricorsiva definita con base e induzione correttamente
espresse. Si deve tenere conto di:
■ Si devono correttamente definire le operazioni da effettuare
nella fase discendente e le operazioni da effettuare nella
fase ascendente.
■ Nella fase discendente si effettuano solo operazioni Push,
nella fase ascendente solo operazioni Pop.
■ Ciò che si mette sulla pila è il contesto o l’ambiente
dell’applicazione del passo induttivo.
■ Ciò che viene effettuato con il prodotto dei Pop è il calcolo da
effettuare dell’applicazione del passo induttivo.
- p. 11/??
Linguaggi di programmazione e Ricorsione
La ricorsione è utilizzata:
■ nelle definizioni delle grammatiche dei linguaggi di
programmazione
■ in strutture dati utilizzate correntemente dai linguaggi di
programmazione (liste, code, pile, alberi, graf i, . . . )
■ negli algoritmi di ordinamento (quicksort, naturaljoin, . . . )
■ negli algoritmi che gestiscono strutture dati definite
ricorsivamente
■ in generale in tutti i contesti dove è possibile descrivere in
modo induttivo
Si considere che la ricorsione è molto potente, elegante e
compatta ma dispendiosa dal punto di vista computazionale.
- p. 12/??
Definizione ricorsiva
La definizione di espressione regolare è possibile esprimerla in
modo risorsivo


ǫ




a
se a ∈ Σ



 E|E
E=

EE





E∗



(E)
Ma le stringhe che denotano espressioni regolari non possono
essere riconosciute da un automa a stati finiti. Qualcuno sa
dimostrarlo?
- p. 13/??