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