Programmazione Ricorsione Samuel Rota Bulò DAIS Università Ca Foscari di Venezia.
Outline Ricorsione
Cos è la ricorsione? In matematica... n! = { n (n 1)! se n > 0 1 altrimenti N = {0} {i + 1 : i N} Principio di induzione P(0) P(n) P(n + 1) per ogni n N P(n) per ogni n N Paradosso di Russell A = {x : x / A}
Cos è la ricorsione? In arte... M.C. Escher 1948 M.C. Escher 1956
Cos è la ricorsione? In arte... M.C. Escher 1951 M.C. Escher 1961
Cos è la ricorsione? In arte matematica.. I frattali sono derivate da equazioni ricorsive su C.
Cos è la ricorsione? Nei detti popolari... E nato prima l uovo o la gallina?
Cos è la ricorsione? Dal dizionario... Ricorsione. Se ancora non vi è chiaro, vedi: Ricorsione.
Cos è la ricorsione? Per google...
Cos è la ricorsione? A Mosca...
In sostanza... Per imparare la ricorsione...... dovete prima imparare la ricorsione.
Se ancora non è chiaro... La ricorsione consiste nel definire cose in termini di sè stesse. Consente di definire in modo finito quantità infinite. N = {0} {i + 1 : i N} Consente di formulare la soluzione di un problema in funzione delle soluzioni di instanze più piccole dello stesso problema. { n (n 1)! se n > 0 n! = 1 altrimenti
Il principio di induzione Immaginiamo di voler verificare una proprietà definita sui naturali N. n n(n + 1) P(n) : i = 2 i=0 Innanzitutto dobbiamo verificare P(0) (caso base): P(0) : 0 = 0 i = i=0 0(0 + 1) 2 = 0
Il principio di induzione Successivamente dobbiamo verificare P(n + 1) assumendo P(n) (caso generale o passo induttivo) P(n + 1) : n+1 i = (n + 1) + i=0 = (n + 1) + n i = i=0 n(n + 1) 2 = (n + 1)(n + 2) 2 Per il principio di induzione ora sappiamo che P(n) è vera per ogni n N. P(0) è vera per il caso base P(1) è vera perchè P(0) P(1) per il caso generale P(2) è vera perchè P(1) P(2) per il caso generale...
Funzioni ricorsive Una funzione è ricorsiva se utilizza se stessa all interno della propria definizione. Al fine di potersi richiamare, la funzione deve avere un nome (definita con let). possiamo definire una funzione ricorsiva, ovvero abilitata a richiamare se stessa, nel seguente modo: let rec <fun> = fun <arg> -> <expr> [in <expr>] let rec <fun> <arg> = <expr> [in <expr>] Attenzione: è importante che vi sia sempre un caso base per evitare ricorsioni infinite!
Esempio per il fattoriale # let rec fattoriale n= if n <= 0 then 1 else n* fattoriale (n-1);; val fattoriale : int -> int = <fun> # fattoriale 10;; - : int = 3628800 # let rec fattoriale = function 0 -> 1 n -> n * fattoriale(n-1);; val fattoriale : int -> int = <fun> Cosa succede se invochiamo fattoriale (-1);;?
Esercizi Scrivere una funzione potenza che calcoli n m, n R +, m N. Scrivere una funzione potenza che calcoli n m, n R +, m Z. Scrivere la funzione di Fibonacci: fib(0) = 0, fib(1) = 1, fib(k) = fib(k 1) + fib(k 2). Scrivere una funzione che calcoli il massimo comun divisore di due naturali positivi (con algoritmo di Euclide). Scrivere una funzione che testi la primalità di un numero intero. Scrivere una funzione ricorsiva per calcolare il resto della divisione intera tra due numeri interi.
Esercizi con liste Per risolvere questi esercizi potete utilizzare List.hd: data una lista l ritorna la testa List.tl: data una lista l ritorna la coda List.nth: dati una lista l e un intero i ritorna l i (i-esimo elemento a partire da 0!) List.length: data una lista ritorna la sua lunghezza. Esercizi Scrivere una funzione per invertire una lista. Scrivere una funzione che verifichi se una lista è palindroma (il dritto e il rovescio della lista sono uguali). Scrivere una funzione che calcoli il massimo di una lista. Scrivere una funzione che testi se una lista è monotona crescente o descrescente.
Programmazione Ricorsione Samuel Rota Bulò DAIS Università Ca Foscari di Venezia.