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/??