Ricorsione. La ricorsione consiste nella possibilità di definire una funzione in termini di se stessa

Documenti analoghi
Funzioni e Ricorsione

Come usare la ricorsione

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

Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Matrici. Matrici.h Definizione dei tipi. Un po di esercizi sulle matrici Semplici. Media difficoltà. Difficili

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

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

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

Pile Le pile: specifiche e realizzazioni attraverso rappresentazioni sequenziali e collegate. Pile e procedure ricorsive

Note per la Lezione 6 Ugo Vaccaro

Fondamenti di Programmazione

Corso di Fondamenti di Informatica. La ricorsione

LA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag.

Programmazione II Università di Roma "La Sapienza" Appunti a cura della Prof.ssa FACHINI. Ricorsione per il "problem solving" Il problema del cambio.

FUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:

Problemi e algoritmi. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05 (da U. de' Liguoro - Alg. & Spe. 03/04)

Problemi e algoritmi. Il che cosa ed il come. Il che cosa ed il come. Il che cosa e il come

RICORSIONE. Informatica B - A.A. 2013/2014

La ricorsione. cioè la tesi vale per n + 1. Se ne conclude che vale per ogni n.

Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi:

La principale modalità di calcolo è l applicazione di funzioni

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

Corso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione

Iterazione Vs Ricorsione

Esercitazione 6. Array

L ELABORATORE ELETTRONICO

Calcolare x n = x x x (n volte)

Laboratorio di Informatica

Gocce di Java. Gocce di Java. Metodi e ricorsione. Pierluigi Crescenzi. Università degli Studi di Firenze

Il linguaggio C Il modello a run-time

LE FUNZIONI III PARTE. Manuale linguaggio C

PROGRAMMAZIONE: Le strutture di controllo

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Classi e array. Viene ora affrontato un problema di definizione di una classe in cui una variabile d istanza è di tipo array

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

Fondamenti di Informatica

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

L ELABORATORE ELETTRONICO!

Capitolo 19. Ricorsione

Esercitazione 7. Procedure e Funzioni

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

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Ricorsione. Ricorsione. Ricorsione. Walter Cazzola. Dal dizionario Garzanti (

Laboratorio di Programmazione M-Z

La ricorsione. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Elaboratore Elettronico

Il linguaggio C. Funzioni

Ricerca Automatica. Esercitazione 3. Intelligenza Artificiale Daniele Nardi, 2004 Esercitazione 3 0

Programmi su più moduli - Esempio

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

Capitolo 10 - Strutture

Prima lezione. Le funzioni (subroutines)

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a.

Ricorsione. Emilio Di Giacomo e Walter Didimo

Fondamenti di Informatica T-1 Modulo 2

Le Funzioni e la Ricorsione

Gestione della memoria

Laboratorio di Python

Laboratorio di algoritmi e strutture dati

DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA INFORMATICA B + C

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Gocce di Java. Gocce di Java. Selezione e ripetizione. Pierluigi Crescenzi. Università degli Studi di Firenze

Corso di Perfezionamento

Appunti senza pretese di P2+Lab: Pensare ricorsivamente, programmare iterativamente

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Divide et impera su alberi

10 STRUTTURE DI CONTROLLO REPEAT E WHILE. Strutture di controllo e variabili strutturate

Alberi ed Alberi Binari

Scaletta. Cenni di computabilità. Cosa fa un programma? Definizioni (1/2) Definizioni (2/2) Problemi e domande. Stefano Mizzaro 1

La ricorsione. Politecnico di Milano Sede di Cremona

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Informatica/ Ing. Meccanica/ Edile/ Prof. Verdicchio/ 17/01/2014/ Foglio delle domande / VERSIONE 1

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Rappresentazione degli algoritmi

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Laboratorio di Algoritmi e Strutture Dati

Zeri di una funzione. Funzioni continue - Proprietà. certo intervallo dell'asse x. da: a ξ. cui f(x)=0. precisione desiderata (iterazione( iterazione)

Corso di Informatica

Inserimento in una lista ordinata

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

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Programmazione Ricorsione

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Esercitazione 11. Liste semplici

Heap e code di priorità

Dall analisi alla codifica (1)

Ricorsione. Unità 5. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Si dice che q è il quoziente e r è il resto della divisione di a per b. Inotre, si ha: c = qa. Quindi b ± c = pa ± qa = (p ± q)a e pertanto a (b ± c).

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

I numeri rossi sulla Mole Antonelliana a Natale. Algoritmi e Laboratorio a.a Lezioni. Le regole della riproduzione dei conigli.

L organizzazione dei programmi

Iterazione (introduzione)

Esercitazione 5. Corso di Fondamenti di Informatica. Laurea in Ingegneria Informatica

AA LA RICORSIONE

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

Esercizi di Algoritmi e Strutture Dati

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Transcript:

Funzioni e Ricorsione La ricorsione consiste nella possibilità di definire una funzione in termini di se stessa È basata sul principio di induzione matematica: se una proprietà P vale per n=n 0 e si può provare che, assumendola valida per n,, allora vale per n+1 allora P vale per ogni n nn 0 1 Ricorsione Operativamente occorre: identificare un caso base la cui soluzione sia ovvia di riuscire a esprimere la soluzione al caso generico n in termini dello stesso problema in uno o più casi più semplici (n-1, n-2, n etc). 2 Laboratorio di Informatica L-A 1

Ricorsione Esercizi Esprimere la soluzione di problemi per via funzionale tramite la ricorsione n 1 1. Calcolo della funzione H(n) = k = 1 k H(n) = 1 + 1/2 + 1/3 + + 1/n 2. Calcolo della potenza k-esimak b k con b Z, b k 0k 3. Calcolo del valore di un polinomio di grado n a coefficienti unitari P(x,n) = x 0 + x 1 + x n 3 Funzione H(n) H: N R (int double) H(n) = 1 + 1/2 +1/3 +... + 1/n Per n>1 la funzione si riscrive come: H(n) = (1 + 1/2 +1/3 +... + 1/(n-1)) 1)) + 1/n ossia come H(n) = H(n-1) + 1/n mentre, ovviamente, H(1)=1 4 Laboratorio di Informatica L-A 2

Funzione H(n) Dunque, H(n) = 1 per n = 1 H(n) = 1/n + H(n-1) per n > 1 double H(int n) Altrimenti che succede?! return (n == 1)? 1 : 1.0/n + H(n-1); 5 Potenza k-esimak b k con b Z, b k 0k power: : R N R R (double int double) b k = 1 per k = 0 b k = b * b k-1 per k > 0 da cui: double power(double b, int k) return (k == 0)? 1 : b * power(b, k-1); k 6 Laboratorio di Informatica L-A 3

Polinomio Calcolo del valore di un polinomio di grado n 0n a coefficienti unitari P(x, n) = x 0 + x 1 + x n Per n>0 P(x, n) si riscrive come: P(x, n) = (x 0 + x 1 + x n- 1 ) + x n ossia come P(x, n) = P(x, n-1) n + x n mentre, ovviamente, P(x, 0) = 1 7 Polinomio Dunque, pol(x, n) = 1 per n=0 pol(x, n) = x n + pol(x, n-1) n per n>0 da cui... 1. La funzione pol accetta un double (x)) ed un int (n) 2. Se n è uguale a zero, restituire n... 3....altrimenti.altrimenti restituire la somma di x n power(x, n) del risultato della funzione pol stessa invocata con i valori x e n-1 8 Laboratorio di Informatica L-A 4

Polinomio double pol(double x, int n) return (n==0)? 1 : power(x,n) + pol(x, n-1); n 9 Massimo Comun Divisore Trovare il massimo comun divisore tra due numeri N e M m, se m=n MCD(m, n) = MCD(m-n, n), se m>n MCD(m, n-m), se m<n 10 Laboratorio di Informatica L-A 5

Massimo Comun Divisore Codifica int mcd(int m, int n) if(m == n) else return m; return (m > n)? mcd(m-n, n) : mcd(m, n-m); 11 Massimo Comun Divisore...?! Il risultato viene sintetizzato via via che le chiamate si aprono, in avanti Quando le chiamate si chiudono non si fa altro che riportare indietro, fino al cliente, il risultato ottenuto La ricorsione di questo tipo viene detta Tail Recursion! 12 Laboratorio di Informatica L-A 6

Massimo Comun Divisore...?! La soluzione individuata per l MCD l è sintatticamente ricorsiva......ma dà luogo ad un processo computazionale iterativo, quindi ad un tipo di ricorsione tail!...è tutta colpa dell algoritmo... 13 Massimo Comun Divisore: versione iterativa Identici parametri d ingresso d (ovviamente) Si itera finché n!= m; se i due valori sono uguali, l MCD l è il valore comune Se m > n si assegna ad m il valore m n Altrimenti si assegna ad n il valore n m 14 Laboratorio di Informatica L-A 7

Massimo Comun Divisore: versione iterativa int mcd(int n, int m) int a, b; a = n; b = m; while (a!= b) if (b > a) b = b a; else return a; a = a b; 15 Massimo Comun Divisore: metodo di Euclide int massimocomundivisore (int n1, int n2) int resto,, a, b; if (n1 > n2) a = n1; b = n2; else a = n2; b = n1; while (b > 0) resto = a % b; a = b; b = resto; return a; 16 Laboratorio di Informatica L-A 8

La torre di Hanoi Sono date tre torri (sinistra, centrale, e destra) e un certo numero N di dischi forati I dischi hanno diametro diverso gli uni dagli altri, e inizialmente sono infilati uno sull altro (dal basso in alto) dal più grande al più piccolo sulla torre di sinistra Scopo del gioco è portare tutti e dischi dalla torre di sinistra alla torre di destra,, rispettando due regole: a) si può muovere un solo disco alla volta; b) un disco grande non può mai stare sopra un disco più piccolo. 17 La torre di Hanoi sinistra centrale destra 18 Laboratorio di Informatica L-A 9

La torre di Hanoi Come risolvere il problema? E impensabile immaginare la serie di mosse che risolve il problema in generale E abbastanza semplice esprimere una soluzione ricorsiva Ipotesi: E facile spostare un singolo disco tra due torri a scelta. 19 La torre di Hanoi Soluzione ricorsiva Caso banale: : un singolo disco si sposta direttamente dalla torre iniziale a quella finale Caso generale: per spostare N dischi dalla torre iniziale a quella finale occorre spostare N-1 N 1 dischi dalla torre iniziale a quella intermedia, che funge da appoggio spostare il disco rimanente (il più grande) direttamente dalla torre iniziale a quella finale spostare gli N-1 N 1 dischi posteggiati sulla torre intermedia dalla torre intermedia a quella finale 20 Laboratorio di Informatica L-A 10

La torre di Hanoi 1 sinistra centrale destra 21 La torre di Hanoi 2 sinistra centrale destra 22 Laboratorio di Informatica L-A 11

La torre di Hanoi 3 sinistra centrale destra 23 La torre di Hanoi Notare che: È possibile usare come torre di transito una torre dove ci siano dischi più grandi di quelli da spostare... 24 Laboratorio di Informatica L-A 12

La torre di Hanoi La soluzione delineata per il caso N N dischi presuppone di sapere spostare N-1 N 1 dischi stesso problema in un caso più semplice di sapere spostare un singolo disco abilità che si possiede per ipotesi. È una ricorsione non lineare il problema con N dischi si esplode in due sottoproblemi con N-1 N 1 dischi con N dischi, 2 N -11 attivazioni della funzione. 25 La torre di Hanoi Specifica rappresentiamo le tre torri con un intero rappresentiamo ogni mossa tramite la coppia di torri coinvolte (in futuro le scriveremo sull output) la funzione hanoi ha come parametri il numero di dischi (d)( ) da spostare la torre iniziale la torre finale la torre da usare come appoggio (transito( transito) non ha tipo di ritorno, è una procedura void 26 Laboratorio di Informatica L-A 13

La torre di Hanoi Pseudocodifica 1. Se c èc un solo disco da trasferire, trasferirlo direttamente dalla torre iniziale a quella finale e terminare, altrimenti... 2....trasferire.trasferired-1 dischi dalla torre iniziale alla torre di transito 3. Trasferire un disco dalla torre iniziale alla torre finale 4. Trasferire d-1 dischi dalla torre di transito alla torre finale 27 La torre di Hanoi Interfaccia (header( file) void hanoi(int int dischi, int torreiniziale, int torrefinale, int torretransito); 28 Laboratorio di Informatica L-A 14

La torre di Hanoi void hanoi(int int d, int iniziale, int finale, int transito) if (d==1) printf("muovi un disco dalla torre %d " "alla torre %d\n", iniziale, finale); else hanoi(d-1, iniziale, transito, finale); printf("muovi un disco dalla torre %d " "alla torre %d\n", iniziale, finale); hanoi(d (d-1, transito, finale, iniziale); 29 La torre di Hanoi Possibile estensione alla soluzione per quando si conosceranno gli array: Rappresentare le torri con array di interi Ogni intero all interno dell array rappresenta la dimensione del disco Uno zero, rappresenta l assenza l del disco 30 Laboratorio di Informatica L-A 15