Programmazione Ricorsione

Documenti analoghi
Programmazione Ricorsione in coda

Università Ca Foscari Dipartimento di informatica. Programmazione part-time. Esame Ocaml

Esempio : i numeri di Fibonacci

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

Espressioni aritmetiche

Roadmap. Ricorsione: funzioni ricorsive. Definizione di fattoriale. Definizione dei numeri Fibonacci

Lo sviluppo di un semplice programma e la dimostrazione della sua correttezza

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. La ricorsione

Laboratorio di Python

Tecniche per risolvere problemi: riduzione a sottoproblemi più semplici. Ricorsione

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Risoluzione di un problema

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

Laboratorio di Python

Algoritmi e Strutture Dati

x log(x) + 3. f(x) =

Esercizi riguardanti limiti di successioni e di funzioni

Lezione 4. Problemi trattabili e soluzioni sempre più efficienti. Gianluca Rossi

1 Multipli di un numero

Programmazione funzionale

PROGRAMMAZIONE: La selezione

Ricorsione. Emilio Di Giacomo e Walter Didimo

Programmazione I - Laboratorio

DIARIO DEL CORSO DI ALGEBRA A.A. 2010/11 DOCENTE: ANDREA CARANTI

Tempo e spazio di calcolo (continua)

La ricorsione. Ver Claudio Fornaro - Corso di programmazione in C

METODI MATEMATICI PER L INFORMATICA

Lezione 8 programmazione in Java. Anteprima. La ricorsione. Nicola Drago Dipartimento di Informatica Università di Verona

Transcript:

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.