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.