Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna
|
|
- Mariana Morini
- 6 anni fa
- Visualizzazioni
Transcript
1 Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna
2 2
3 Definizione informale: la ricorsione è un procedimento mediante il quale si definisce una entità in termini di se stessa 3
4 in natura broccolo romanesco 4
5 Triangolo di Sierpinski By Beojan Stanislaus, CC BY-SA 3.0, 5
6 nelle arti visive Immagine sulla confezione del cacao Droste (anno 1904); fonte Wikipedia Copertina dell'album Ummagumma dei Pink Floyd (anno 1969); fonte Wikipedia 6
7 in FINFA
8 Definizione ricorsiva in matematica: Definizione di un concetto usando il concetto stesso Definizione ricorsiva in C: Una funzione che invoca (direttamente o indirettamente) se stessa 8
9 Esempio: successione di Fibonacci Modello (non realistico) di crescita di una popolazione di conigli Una coppia all'inizio del primo mese A partire dal termine del secondo mese di vita, ogni coppia produce un'altra coppia alla fine di ogni mese I conigli non muoiono mai (!) F(n) = coppie al termine del mese n F(1) = 1 F(2) = 1 F(n) = F(n 1) + F(n 2) per ogni n > 2 Leonardo Fibonacci (Pisa, 1170 Pisa, ca. 1250) 9
10 I conigli di Fibonacci
11 Numeri di Fibonacci in natura Il numero di spirali orarie e antiorarie nei fiori di girasole, nelle pigne e in altri vegetali (es., ananas) tendono ad assumere valori appartenenti alla successione di Fibonacci 11
12 Fibonacci in C Metodo ricorsivo per il calcolo della successione di Fibonacci F(1) = 1 F(2) = 1 F(n) = F(n 1) + F(n 2) per ogni n > 2 int fib(int n) if (n <= 2) else return fib(n - 1) + fib(n 2); 12
13 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 13
14 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; Ret int main( void ) printf("%d\n", fib(3)); return 0; 14
15 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; n 3 Ret int main( void ) printf("%d\n", fib(3)); return 0; 15
16 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; n 3 Ret int main( void ) printf("%d\n", fib(3)); return 0; 16
17 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; n1 n?? 3 Ret int main( void ) printf("%d\n", fib(3)); return 0; 17
18 Esempio di esecuzione #include <stdio.h> n1 n Ret?? 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 18
19 Esempio di esecuzione #include <stdio.h> n n1 n 2 Ret?? 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 19
20 Esempio di esecuzione #include <stdio.h> n n1 n 2 Ret?? 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 20
21 Esempio di esecuzione #include <stdio.h> n n1 n 2 Ret?? 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 21
22 Esempio di esecuzione #include <stdio.h> n1 n 1?? 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 22
23 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; n1 n 1 3 Ret int main( void ) printf("%d\n", fib(3)); return 0; 23
24 Esempio di esecuzione #include <stdio.h> n2 n1 n?? 1 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 24
25 Esempio di esecuzione #include <stdio.h> n2 n1 n Ret?? 1 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 25
26 Esempio di esecuzione #include <stdio.h> n n2 n1 n 1 Ret?? 1 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 26
27 Esempio di esecuzione #include <stdio.h> n n2 n1 n 1 Ret?? 1 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 27
28 Esempio di esecuzione #include <stdio.h> n n2 n1 n 1 Ret?? 1 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 28
29 Esempio di esecuzione #include <stdio.h> n2 n1 n 1?? 1 3 Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 29
30 Esempio di esecuzione #include <stdio.h> n2 n1 n Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 30
31 Esempio di esecuzione #include <stdio.h> n2 n1 n Ret int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; int main( void ) printf("%d\n", fib(3)); return 0; 31
32 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; 2 int main( void ) printf("%d\n", fib(3)); return 0; 32
33 Esempio di esecuzione #include <stdio.h> int fib(int n) if (n <= 2) else int n1 = fib(n-1); int n2 = fib(n-2); return n1 + n2; 0 int main( void ) printf("%d\n", fib(3)); return 0; 33
34 Albero delle chiamate ricorsive fib(6) fib(5) fib(4) fib(3) fib(2) fib(2) fib(4) fib(3) fib(2) fib(1) fib(3) fib(2) fib(2) fib(1) fib(1) 34
35 Costo computazionale Sia T(n) il numero di chiamate chiamate alla funzione fib() che servono per calcolare fib(n) 1 chiamata per fib(1) T(1) = 1 1 chiamata per fib(2) T(2) = 1 3 chiamate per fib(3) T(3) = 3 5 chiamate per fib(4) T(4) = 5 T(n) = T(n - 1) + T(n - 2) + 1 fib(3) fib(2) fib(4) fib(3) fib(2) fib(1) fib(2) fib(1) 35
36 Quanto è grande T(n)? Calcoliamo un limite inferiore per T(n) Sfruttiamo il fatto che T(n) è non decrescente, cioè T(n) T(n-1) T (n) = T (n 1)+T (n 2)+1 2 T (n 2)+1 4 T (n 4) T (n 6) k 1 k 2 T (n 2 k )+ 2 i i=0... n/2 n/ n/2 2 36
37 Albero della ricorsione La funzione fib(n) richiede un numero di chiamate ricorsive almeno esponenziale di n La sua inefficienza deriva dal fatto che ricalcola più volte gli stessi valori fib(6) fib(5) fib(4) fib(3) fib(2) fib(2) fib(1) fib(4) fib(3) fib(2) fib(1) fib(3) fib(2) fib(2) fib(1) 37
38 Versione iterativa di fib(n) Possiamo riscrivere fib(n) in forma iterativa, ottenendo una versione molto più efficiente Non è sempre così: le funzioni ricorsive non diventano automaticamente più efficienti se riscritte in modo iterativo int fib(int n) if (n <= 2) else int i, fn; int fn1=1, fn2=1; for (i=3; i<=n; i++) fn = fn1 + fn2; fn2 = fn1; fn1 = fn; return fn; 38
39 Versione iterativa di fib(n) fn2 fn1 fn 1 1 i= i= i= i= int fib(int n) if (n <= 2) else int i, fn; int fn1=1, fn2=1; for (i=3; i<=n; i++) fn = fn1 + fn2; fn2 = fn1; fn1 = fn; return fn; 39
40 La differenza tra un algoritmo di costo Fibonacci ricorsivo Intel 2015 A.D. Fibonacci iterativo Commodore 1982 A.D. fib(10) 0.001s 0.066s fib(20) 0.001s 0.150s fib(30) 0.013s 0.233s fib(50) s 0.400s 40
41 Fattoriale Metodo ricorsivo per il calcolo del fattoriale 0! = 1 n! = n (n 1)! per ogni n > 0 int fatt(int n) if (n == 0) else return n * fatt(n 1); 41
42 Elevamento a potenza potenza(a,n) calcola an per a > 0, n 0 potenza(a, 0) = 1 potenza(a, n) = a potenza(a, n-1), se n > 0 double potenza(double a, int n) if (n == 0) return 1.0; else return a * potenza(a, n-1); Esercizio per casa: scrivere una versione di potenza() che funzioni anche quando n < 0 42
43 Una funzione ricorsiva corretta ha le caratteristiche seguenti Include uno o più casi base, in cui il valore della funzione viene calcolato senza invocare la funzione Include una o più invocazioni ricorsive della funzione; nelle chiamate ricorsive generalmente si usano parametri che "avvicinano" ai casi base 43
44 Attenzione La ricorsione deve terminare Per la successione di Fibonacci, la ricorsione termina nei casi base fib(1) e fib(2) Per il fattoriale, il caso base è fatt(0) Per l'elevamento a potenza, il caso base è potenza(a,0) Ogni chiamata dovrebbe avvicinare al caso base Attenzione, però... /* Per quali valori di n la funzione seguente termina? */ int fun(int n) if ( n == 0 ) else return (n + fun(n-2)); 44
45 Le torri di Hanoi Narra la leggenda che in un tempio indiano si trovi una stanza contenente una lastra di bronzo con sopra tre pioli di diamante. Dopo la creazione dell'universo, 64 dischi d'oro sono stati infilati in uno dei pioli in ordine decrescente di diametro, con il disco più largo appoggiato al piano di bronzo. Da allora, i monaci del tempio si alternano per spostare i dischi dal piolo originario ad un altro piolo, seguendo le rigide regole di Brahma: i dischi vanno maneggiati uno alla volta, e non si deve mai verificare che un disco più largo sovrasti uno più piccolo sullo stesso piolo. Quando tutti i dischi saranno spostati su un altro piolo, l'universo avrà fine. Fonte: George Gamow, One, two, tree... infinity!, Dover Publications,
46 Le torri di Hanoi Gioco matematico tre pioli n dischi di dimensioni diverse Inizialmente tutti i dischi sono impilati in ordine decrescente (più piccolo in alto) nel piolo di sinistra Scopo del gioco Impilare in ordine decrescente i dischi sul piolo di destra Senza mai impilare un disco più grande su uno più piccolo Muovendo un disco alla volta Utilizzando se serve anche il piolo centrale 46
47 src tmp dst Idea Per spostare n dischi dal piolo src al piolo dst, usando tmp come appoggio Se c'è un solo disco Spostalo da src a dst Se ci sono n dischi Sposta gli n - 1 dischi in cima a src verso tmp, usando dst come appoggio Sposta un disco da src a dst Sposta n - 1 dischi in cima a tmp verso dst, usando src come appoggio 47
48 Soluzione ricorsiva per le torri di Hanoi /* hanoi.c */ void hanoi(int src, int dst, int tmp, int n) if (n == 1) printf("muovi da %d a %d\n", src, dst); else hanoi(src, tmp, dst, n-1) printf("muovi da %d a %d\n", src, dst); hanoi(tmp, dst, src, n-1) hanoi(1,3,2,n) sposta n dischi dal piolo 1 al piolo 3, usando il piolo 2 come appoggio n - 1 dischi da src a tmp 1 disco da src a dst n - 1 dischi da tmp a dst 48
49 1 2 3 Esempio con 3 dischi 3 dischi da 1 a 3 2 dischi da 1 a 2 1 disco da 1 a dischi da 2 a 3 1 disco da 3 a disco da 2 a disco da 1 a
50 Numero di chiamate ricorsive void hanoi(int src, int dst, int tmp, int n) if (n == 1) printf("muovi da %d a %d\n", src, dst); else hanoi(src, tmp, dst, n-1) printf("muovi da %d a %d\n", src, dst); hanoi(tmp, dst, src, n-1) Quanti spostamenti sono necessari per risolvere il problema con n dischi? T(1) = 1 T(n) = 2 T(n 1) + 1 per n > 1 Domanda: Quale è la soluzione della ricorrenza? Se i monaci eseguissero una mossa al secondo, per trasferire tutti i 64 dischi servirebbe un tempo pari a circa 127 volte l'età del nostro sole 50
51 Ricerca binaria ricorsiva /* ricerca-binaria-ric.c : versione ricorsiva della ricerca binaria */ #include <stdio.h> int ricbinaria_ric(int v[], int i, int f, int k) if ( i > f ) return -1; /* non trovato */ else int m = (i + f) / 2; if (v[m] == k) return m; /* trovato in posizione m */ else if (v[m] > k) return ricbinaria_ric(v, i, m-1, k); else return ricbinaria_ric(v, m + 1, f, k); int ricbinaria(int v[], int n, int k) return ricbinaria_ric(v, 0, n-1, k); 51
52 mutua (indiretta) Una funzione f1 ne chiama un'altra f2 (che ne chiama un'altra f3 ) che chiama f1 Es.: definiamo, usando la ricorsione mutua, due funzioni pari e dispari che accettano un intero positivo n e ritornano 1 se n è pari (risp. dispari), 0 altrimenti Idea: pari(n) = dispari(n - 1) dispari(n) = pari(n - 1) Base della ricorsione: pari(0) = 1 dispari(0) = 0 52
53 /* pari-dispari.c : determina se un numero e' pari o dispari usando due funzioni mutuamente ricorsive */ #include <stdio.h> /* Dichiarazione delle funzioni pari e dispari */ int pari(int n); int dispari(int n); /* Definizione delle funzioni pari e dispari */ int pari(int n) if (n == 0) else return dispari(n 1); int dispari(int n) if (n == 0) return 0; else return pari(n 1); int main( void ) int i; for (i=0; i<10; i++) printf("%d pari=%d dispari=%d\n", i, pari(i), dispari(i)); return 0; 53
Tecniche Algoritmiche/1 Divide et Impera
Tecniche Algoritmiche/1 Divide et Impera Ivan Lanese Dipartimento di Informatica Scienza e Ingegneria Università di Bologna Ivan.lanese@gmail.com http://www.cs.unibo.it/~lanese/ Divide-et-impera 2 Tecniche
DettagliRICORSIONE. Informatica B - A.A. 2013/2014
RICORSIONE Informatica B - A.A. 2013/2014 RICORSIONE Che cos è la ricorsione? Un sottoprogramma P richiama se stesso (ricorsione diretta) Un sottoprogramma P richiama un altro sottoprogramma Q che comporta
Dettaglin n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita
Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita n! = 1 n( n 1)! se se n n = > 0 0 dove n è un numero intero non negativo Il calcolo del fattoriale
DettagliFunzioni e Ricorsione
Funzioni e Ricorsione La ricorsione consiste nella possibilità di definire una funzione in termini di se stessa Nel codice di una funzione ricorsiva compare una (o più di una) chiamata alla funzione stessa
DettagliLezione 8 programmazione in Java. Anteprima. La ricorsione. Nicola Drago Dipartimento di Informatica Università di Verona
Lezione 8 programmazione in Java Nicola Drago nicola.drago@univr.it Dipartimento di Informatica Università di Verona Anteprima Programmazione ricorsiva Fattoriale Somma di n numeri Torre di Hanoi Array
DettagliRicorsione. La ricorsione consiste nella possibilità di definire una funzione in termini di se stessa
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ò
DettagliCorso di Fondamenti di Programmazione canale E-O. Un esempio. Funzioni ricorsive. La ricorsione
Corso di Fondamenti di Programmazione canale E-O Tiziana Calamoneri Ricorsione DD Cap. 5, pp. 160-184 KP Cap. 5, pp. 199-208 Un esempio Problema: prendere in input un intero e calcolarne il fattoriale
DettagliCome usare la ricorsione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano www.dia.unisa.it/dottorandi/murano 1 Come usare la ricorsione 2 1 Risolvere un problema per ricorsione 1. Pensa ad un problema piu piccolo (di taglia
DettagliEsempio : i numeri di Fibonacci
Esempio : i numeri di Fibonacci La successione di Fibonacci F 1, F 2,... F n,... è definita come: F 1 =1 F 2 =1 F n =F n 1 F n 2,n 2 Leonardo Fibonacci (Pisa, 1170 Pisa, 1250) http://it.wikipedia.org/wiki/leonardo_fibonacci
DettagliIterazione Vs Ricorsione
Iterazione Vs Ricorsione Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 7 Gennaio 2014 Nota per i 7 Cosa: Prova colpo-singolo No libri, e/o appunti 1 exe in C in 30 Quando Domani:
DettagliProgrammazione II Università di Roma "La Sapienza" Appunti a cura della Prof.ssa FACHINI. Ricorsione per il "problem solving" Il problema del cambio.
Programmazione II Università di Roma "La Sapienza" Appunti a cura della Prof.ssa FACHINI Ricorsione per il "problem solving" Il problema del cambio. Consideriamo il problema di determinare in quanti modi
DettagliRicorsione. quindi si può definire n! mediante i seguenti due punti:
Ricorsione Due definizioni del fattoriale Prima definizione: n! = 1 2 3....(n-1) n Per la seconda definizione notiamo che 1 2 3.... n = (n-1)! n (n-1)! quindi si può definire n! mediante i seguenti due
DettagliTempo e spazio di calcolo (continua)
Tempo e spazio di calcolo (continua) I numeri di Fibonacci come case study (applichiamo ad un esempio completo le tecniche illustrate nei lucidi precedenti) Abbiamo introdotto tecniche per la correttezza
DettagliLaboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A
Ingegneria e Scienze Informatiche - Cesena A.A. 2013-2014 dilena@cs.unibo.it, pietro.dilena@unibo.it Note introduttive sul corso Modalità d esame Note introduttive sul corso Finalità: fornire competenze
DettagliPile Le pile: specifiche e realizzazioni attraverso rappresentazioni sequenziali e collegate. Pile e procedure ricorsive
Pile Le pile: specifiche e realizzazioni attraverso rappresentazioni sequenziali e collegate. Pile e procedure ricorsive Algoritmi e Strutture Dati + Lab A.A. 14/15 Informatica Università degli Studi di
DettagliGestione della memoria
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm
DettagliTempo e spazio di calcolo (continua)
Tempo e spazio di calcolo (continua) I numeri di Fibonacci come case study (applichiamo ad un esempio completo le tecniche illustrate nei lucidi precedenti) Abbiamo introdotto tecniche per la correttezza
DettagliLaboratorio di algoritmi e strutture dati
Laboratorio di algoritmi e strutture dati Docente: Violetta Lonati Giovedì 13 ottobre 2016 1 Esercizi introduttivi 1.1 Potenza Scrivete una funzione avente due parametri interi b ed e che calcoli la potenza
DettagliLa ricorsione. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino
La ricorsione Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino Sommario! Definizione di ricorsione e strategie divide et impera! Semplici algoritmi ricorsivi! Merge
DettagliProgrammazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013
Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario La ricorsione Metodi ricorsivi Esercizi proposti 16/01/2013 2 La ricorsione In Java ogni metodo può chiamare anche se stesso,
Dettaglin n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita
Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita n! = 1 n( n 1)! se se n n = > 0 0 dove n è un numero intero non negativo Il calcolo del fattoriale
DettagliL organizzazione dei programmi
L organizzazione dei programmi Lo sviluppo top-down L.S. Touschek - A.S. 2015/2016 - I fondamenti del Linguaggio C F. Cardarelli Lo sviluppo top-down I problemi complessi Blocco 1 Istruzione 1 Istruzione
DettagliRicorsione. Ricorsione. Ricorsione. Walter Cazzola. Dal dizionario Garzanti (www.garzantilinguistica.it).
Outline vs Iterazione. Walter Cazzola Dipartimento di Informatica e Comunicazione Università degli Studi di Milano Definizioni La ricorsione come strumento di programmazione implementazione di metodi ricorsivi
DettagliLa ricorsione. Ver Claudio Fornaro - Corso di programmazione in C
La ricorsione Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C 2 Divide et impera Metodo di approccio ai problemi che consiste nel dividere il problema dato in problemi più semplici I risultati
DettagliIl Piacere della Logica. La Torre di Hanoi. Il Piacere della Logica. Prof. Ivano Coccorullo
La Torre di Hanoi Le Torri di Hanoi Il problema delle Torri di Hanoi deriva da una antica leggenda indiana che recita così: «nel grande tempio di Brahma a Benares, su di un piatto di ottone, sotto la cupola
DettagliDIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA. INFORMATICA B Ingegneria Elettrica. La ricorsione
INFORMATICA B Ingegneria Elettrica La ricorsione Ricorsione Che cos è la ricorsione? Un sottoprogramma P richiama se stesso (ricorsione diretta) Un sottoprogramma P richiama un altro sottoprogramma Q che
DettagliProgrammazione a moduli in C
Funzioni Programmazione a moduli in C Politecnico di Milano Motivazioni Alcuni programmi possono essere molto, molto complessi E utile poter partizionare il lavoro di progettazione in sottolavori più semplici
DettagliAlgoritmi e Strutture Dati
Algoritmi Ricorsivi e Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 I conigli di Fibonacci Ricerca Binaria L isola dei conigli
DettagliDIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. La Ricorsione. Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 29 Maggio 2014
La Ricorsione Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 29 Maggio 2014 Obiettivi La ricorsione Ricordate la sigla GNU GNU = GNU is Not Unix GNU = GNU is Not Unix GNU = GNU is
DettagliEsercitazione 5. Procedure e Funzioni Il comando condizionale: switch
Esercitazione 5 Procedure e Funzioni Il comando condizionale: switch Comando: switch-case switch (espressione) { /* espressione deve essere case costante1: istruzione1 di tipo int o char */ [break]; case
DettagliAlgoritmi e Strutture Dati
Algoritmi e Strutture Dati Capitolo 1 Un introduzione informale agli algoritmi Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Definizione informale di algoritmo Insieme di istruzioni, definite
DettagliParte 2. Ricorsione. [M.C.Escher Drawing hands, 1948] - AA. 2012/13 2.1
Parte 2 Ricorsione - AA. 2012/13 [M.C.Escher Drawing hands, 1948] 2.1 Funzioni ricorsive Una funzione si dice ricorsiva se richiama se stessa, direttamente o indirettamente La ricorsione si dice diretta
DettagliCapitolo 19. Ricorsione
Capitolo 19 La ricorsione Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a sé stessa Esempio: Funzione fattoriale su interi non negativi: f(n) = n!
DettagliAlgoritmi e Strutture Dati
Algoritmi e Strutture Dati Informazioni sul corso + Un introduzione informale agli algoritmi Domenico Fabio Savo 1 Domenico Fabio Savo Email: savo@dis.uniroma1.it Web: http://www.dis.uniroma1.it/~savo
DettagliGocce di Java. Gocce di Java. Metodi e ricorsione. Pierluigi Crescenzi. Università degli Studi di Firenze
Gocce di Java Pierluigi Crescenzi Università degli Studi di Firenze Ancora sui metodi Interfaccia di un metodo Consente di utilizzarlo senza sapere nulla dell implementazione Consente di implementarlo
DettagliEsercitazione 5. Corso di Fondamenti di Informatica. Laurea in Ingegneria Informatica
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Esercitazione 5 Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti
DettagliRicorsione. Corso di Fondamenti di Informatica
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Ricorsione Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti e
DettagliINFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan
INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan venus.unive.it/borg borg@unive.it Ricevimento lunedì, prima o dopo lezione 1 Le funzioni in C Le funzioni vengono utilizzate per 3 motivi: Riusabilità
DettagliLA RICORSIONE IN C. CdL Ingegneria Informatica n.o. Anno Accademico 2006/07 Fondamenti di Informatica I corso A Giacomo Piscitelli pag.
I lucidi sono una rielaborazione e integrazione di quelli messi a disposizione dei docenti nel sito relativo al testo: Informatica: arte e mestiere 2/ed Stefano Ceri, Dino Mandrioli, Licia Sbattella Copyright
DettagliIl linguaggio C Strutture
Il linguaggio C Strutture Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ Linguaggio C -- Strutture 2 Ringraziamenti Questi
DettagliI numeri rossi sulla Mole Antonelliana a Natale. Algoritmi e Laboratorio a.a Lezioni. Le regole della riproduzione dei conigli.
I numeri rossi sulla Mole Antonelliana a Natale Università di Torino acoltà di Scienze MN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. 29- Lezioni prof. Elio
DettagliRicorsione. (da lucidi di Marco Benedetti)
Ricorsione (da lucidi di Marco Benedetti) Funzioni ricorsive Dal punto di vista sintattico, siamo in presenza di una funzione ricorsiva quando all interno della definizione di una funzione compaiono una
DettagliFondamenti di Programmazione
Fondamenti di Programmazione 1 Programmazione Concetti base: dati istruzioni Dati: variabili tipi Istruzioni: istruzioni base strutture di controllo sotto-programmi 2 Sotto-programmi Necessità di scomporre
DettagliCorso di Laurea in Matematica
Corso di Laurea in Matematica Laboratorio di Informatica (a.a. 2003-04) Esercizi di programmazione in C: funzioni e procedure 1 Docente: Monica Nesi Nota Nelle soluzioni di alcuni degli esercizi riportati
DettagliLE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve
LE STRUTTURE DATI DINAMICHE: GLI ALBERI Cosimo Laneve 1 argomenti 1. definizione di alberi e nozioni relative 2. implementazione degli alberi, creazione, visita 3. algoritmo di visita iterativa e sua implementazione
DettagliTecniche Algoritmiche
Tecniche Algoritmiche Damiano Macedonio Università Ca' Foscari di Venezia mace@unive.it Original work Copyright Alberto Montresor, Università di Trento, Italy Modifications Copyright 2009 2012 Moreno Marzolla,
DettagliFondamenti di Informatica T. Linguaggio C: Stack e Ricorsione
Linguaggio C: Stack e Ricorsione FUNZIONI: IL MODELLO A RUN-TIME Ogni volta che viene invocata una funzione: si crea di una nuova attivazione (istanza) del servitore viene allocata la memoria per i parametri
DettagliFUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:
FUNZIONI RICORSIVE Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento (chiamata) a se stessa. Esempio: Esempi di problemi ricorsivi: 1) Somma dei primi
DettagliDefinizione di metodi in Java
Definizione di metodi in Java Un metodo in Java definisce un operazione ad alto livello (sottoprogramma) che consente di manipolare dati e oggetti. Durante la computazione effettuata da un programma, un
DettagliLaboratorio di Informatica
Laboratorio di Informatica Seconda lezione a Python Dottore Paolo Parisen Toldin - parisent@cs.unibo.it Dottoressa Sara Zuppiroli - sara.zuppiroli@unibo.it L'importanza di capire Perché non dobbiamo dichiarare
DettagliIl linguaggio C. Funzioni
1 Il linguaggio C Funzioni Funzioni C A cosa servono? a raccogliere il codice comune a più parti del programma per poterlo defininire e mettere a punto una volta per tutte Es: ho replicato 37 volte il
DettagliSi 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).
I numeri interi Teorema 1 (divisione in Z) Siano a, b Z, b 0 Allora esistono e sono unici q, r Z tali che (1) a = bq + r () 0 r < b Si dice che q è il quoziente e r è il resto della divisione di a per
DettagliLa ricorsione. cioè la tesi vale per n + 1. Se ne conclude che vale per ogni n.
La ricorsione 1. Induzione e definizioni ricorsive Una definizione che adoperasse il concetto stesso che intende definire sarebbe considerata circolare e dunque vuota, per le stesse ragioni per cui non
DettagliUn tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:
Pag 29 4) La ricorsione 4.1 Funzioni matematiche ricorsive Partiamo da un concetto ben noto, quello delle funzioni matematiche ricorsive. Una funzione matematica è detta ricorsiva quando la sua definizione
DettagliFondamenti di Informatica 6. Algoritmi e pseudocodifica
Vettori e matrici #1 Fondamenti di Informatica 6. Algoritmi e pseudocodifica Corso di Laurea in Ingegneria Civile A.A. 2010-2011 1 Semestre Prof. Giovanni Pascoschi Le variabili definite come coppie
DettagliAA 2006-07 LA RICORSIONE
PROGRAMMAZIONE AA 2006-07 LA RICORSIONE AA 2006-07 Prof.ssa A. Lanza - DIB 1/18 LA RICORSIONE Il concetto di ricorsione nasce dalla matematica Una funzione matematica è definita ricorsivamente quando nella
DettagliEsempi di Problemi Iterativi
Corso di Laurea Ingegneria Civile Elementi di Informatica Esempi di Problemi Iterativi C. Limongelli Esempi di Problemi Iterativi 1 Contenuti Esercizi: Palindroma Anagramma Fibonacci Esempi di Problemi
DettagliLaboratorio di programmazione
Laboratorio di programmazione 30 novembre 2007 Sequenze di Collatz Considerate la seguente regola: dato un numero intero positivo n, se n è pari lo si divide per 2, se è dispari lo si moltiplica per 3
DettagliEsercitazione 2. Corso di Fondamenti di Informatica
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Esercitazione 2 Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti
DettagliRicerca Automatica. Esercitazione 3. Intelligenza Artificiale Daniele Nardi, 2004 Esercitazione 3 0
Ricerca Automatica Esercitazione 3 Intelligenza Artificiale Daniele Nardi, 2004 Esercitazione 3 0 Ascensore In un grattacielo ci sono 3 coppie formate da marito e moglie. Il cancello delle scale viene
DettagliEsercizi di Algoritmi e Strutture Dati
Esercizi di Algoritmi e Strutture Dati Moreno Marzolla http://www.moreno.marzolla.name/ Ultima Modifica: 7 ottobre 202 Copyright Portions of this work are Copyright 202, Moreno Marzolla. This work is licensed
DettagliLaboratorio di Programmazione M-Z
Diretta Laboratorio di Programmazione M-Z Docente: Dott.ssa Alessandra Lumini alessandra.lumini@unibo.it Università di Bologna, Sede di Cesena Divide et impera Dividere un problema in sottoproblemi più
DettagliLE FUNZIONI III PARTE. Manuale linguaggio C
LE FUNZIONI III PARTE Manuale linguaggio C Divide et impera Metodo di approccio ai problemi che consiste nel dividere il problema dato in problemi più semplici. I risultati ottenuti risolvendo i problemi
DettagliAppunti senza pretese di P2+Lab: Pensare ricorsivamente, programmare iterativamente
Appunti senza pretese di P2+Lab: Pensare ricorsivamente, programmare iterativamente Alessandro Panconesi DSI, La Sapienza via Salaria 113, piano terzo 00198 Roma In queste dispense ci occuperemo di un
DettagliCorso di Fondamenti di Informatica. La ricorsione
Corso di Fondamenti di Informatica La ricorsione La ricorsione Si dice che un oggetto (una struttura dati, una funzione matematica, un concetto ) è ricorsivo se è possibile darne una definizione in termini
DettagliLe Funzioni e la Ricorsione
Aula V Dip. di Matematica G. Castelnuovo Univ. di Roma La Sapienza Le Funzioni e la Ricorsione Igor Melatti Slides disponibili (assieme ad altro materiale) in: http://www.dsi.uniroma1.it/ melatti/programmazione1.2007.2008.html
DettagliAlgoritmi e strutture dati
Algoritmi e Strutture Dati Capitolo 1 Un introduzione informale agli algoritmi Definizione informale di algoritmo Insieme di istruzioni, definite passo per passo, in modo da poter essere eseguite meccanicamente
DettagliEsercitazione 7. Procedure e Funzioni
Esercitazione 7 Procedure e Funzioni Esercizio Scrivere un programma che memorizza in un array di elementi di tipo double le temperature relative al mese corrente e ne determina la temperatura massima,
DettagliMatlab/Octave - Esercitazione 11
Facoltà di Ingegneria Industriale Laurea in Ingegneria Energetica, Meccanica e dei Trasporti Matlab/Octave - Esercitazione 11 programmazione ricorsiva Politecnico di Milano - DEI Informatica B - Esercitazione
DettagliUna funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.
Ricorsione Funzioni ricorsive Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente. Un esempio di funzione ricorsiva
DettagliEsercitazione 6. Array
Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione
DettagliEsempi di Problemi Iterativi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E07 C. Limongelli Dicembre 2011 1 Contenuti q Esercizi: Palindroma Anagramma Fibonacci 2 Palindroma q Scrivere un programma che
DettagliLinguaggio C: Espressioni
Linguaggio C: Espressioni Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ 2 Ringraziamenti prof. Mirko Viroli, Università
DettagliFondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012
Fondamenti di Informatica - 1 Prof. B.Buttarazzi A.A. 2011/2012 Sommario Operatore? Tipo di dato: struct La ricorsione Funzioni ricorsive Esercizi proposti 26/04/2012 2 Operatore? L'operatore? può essere
DettagliCosto di esecuzione. Quanto costa? Spazio. Spazio e tempo. Università Roma La Sapienza Corsi di Laurea Informatica/Tecnologie Informatiche
Università Roma La Sapienza Corsi di Laurea Informatica/Tecnologie Informatiche Quanto costa? Prof. Stefano Guerrini guerrini@di.uniroma1.it Programmazione II (can. P-Z) A.A. 2005-06 Cosa contribuisce
DettagliCorso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 18/7/2016
Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 18/7/2016 Chi deve recuperare il progetto del modulo 1 ha 1 ora e 30 minuti per svolgere gli esercizi 1, 2, 3 Chi deve recuperare
DettagliIl linguaggio C Il modello a run-time
3 Il linguaggio C Il modello a run-time Puntatore al codice Return address Link dinamico Parametro Parametro 2... Variabile locale Variabile locale 2... B A A 3 FUNZIONI: IL MODELLO A RUN-TIME Ogni volta
DettagliStudio delle successioni con il software
Studio delle successioni con il software Abbiamo visto due possibili definizioni per alcune successioni: diretta e per ricorrenza (o ricorsiva). Ricordiamo che la successione delle somme dei primi n numeri
DettagliProgrammazione di base
Fondamenti di Informatica Primo Appello 01-17 8 febbraio 017 Rispondi alle domande negli appositi spazi. I punti assegnati per ogni domanda sono indicati nel riquadro a lato. L'esame contiene 10 domande,
DettagliProgrammazione I - Laboratorio
Programmazione I - Laboratorio Esercitazione 6 - Liste Gianluca Mezzetti 1 Paolo Milazzo 2 1. Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ mezzetti mezzetti di.unipi.it 2. Dipartimento
DettagliLa principale modalità di calcolo è l applicazione di funzioni
1 La principale modalità di calcolo è l applicazione di funzioni Nei linguaggi funzionali puri non esistono strutture di controllo predefinite per la realizzazione di cicli quali for, while, repeat Un
DettagliEsercizio 1 - cicli. Esercizio 1 cicli - Soluzione
Sequenze di cifre Esercizio 1 - cicli Realizzare un programma che prende in input una sequenza di cifre (tra 1 e 9) e calcola la somma massima fra le sotto- sequenze di cifre non decrescente Il programma
DettagliC: panoramica. Violetta Lonati
C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati
DettagliProgrammazione dinamica
Programmazione dinamica Primi esempi 29 ottobre 2014 Punto della situazione Abbiamo visto: analisi asintotica relazioni di ricorrenza (vedremo altri esempi) prima tecnica di programmazione: divide-etimpera
DettagliRICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3
RICORSIVITA 1. Cos è la ricorsività? La ricorsività è un metodo di soluzione dei problemi che consiste nell esprimere la soluzione relativa al caso n in funzione della soluzione relativa al caso n-1. La
DettagliAlgoritmi e strutture di dati 2
Paola Vocca Lezione 4: Programmazione dinamica 1 Caratteristiche Programmazione dinamica: paradigma basato sullo stesso principio utilizzato per il divide et impera o il problema viene decomposto in sotto-problemi
DettagliUNIVERSITÀ DEGLI STUDI DI TRIESTE
UNIVERSITÀ DEGLI STUDI DI TRIESTE FACOLTÀ DI ECONOMIA APPUNTI SUGLI ALGORITMI ANNO ACCADEMICO 2007-2008 Renato Pelessoni 1 ALGORITMI Un algoritmo è un insieme finito di istruzioni che consente di risolvere
DettagliEsercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);
Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di
DettagliL'anno scorso abbiamo parlato della disposizione delle parti di una pianta: i flosculi nei capolini delle Composite...
Numeri e piante due mondi a confronto L'anno scorso abbiamo parlato della disposizione delle parti di una pianta: i flosculi nei capolini delle Composite... Echinacea purpurea Le spirali orarie sono 55
DettagliEsercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni
Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni Esercizio 1 Dire quale è la complessità temporale del seguente metodo, espressa con notazione asintotica O(.) (con la migliore
Dettaglipublic static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;
Metodi iterativi con array monodimensionali 1. Scrivere un metodo che, dato un array di interi a, restituisce il valore minimo in a. public static int minimo (int[] a) { int min = a[0]; for (int i=1; i
DettagliFondamenti di Informatica II. Algoritmi ricorsivi e Backtracking
Università degli studi di Messina Facoltà di Ingegneria Corso di Laurea in Ingegneria Informatica e delle Telecomunicazioni Fondamenti di Informatica II Algoritmi ricorsivi e Backtracking Introduzione
DettagliLa ricorsione. Politecnico di Milano Sede di Cremona
La ricorsione Politecnico di Milano Sede di Cremona Gianpaolo Cugola Dipartimento di Elettronica e Informazione cugola@elet.polimi.it http://www.elet.polimi.it/~cugola Definizioni ricorsive Sono comuni
DettagliLaboratorio di Algoritmi e Strutture Dati
Laboratorio di Algoritmi e Strutture Dati Docente: Camillo Fiorentini 8 gennaio 8 Il problema è simile all esercizio 5.6 del libro di testo di algoritmi (Introduzione agli algoritmi e strutture dati, T.
DettagliCorso di Laurea in Ingegneria Gestionale Esame di Informatica a.a luglio 2011
Cognome Nome Matricola Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2010-11 8 luglio 2011 Testo Il database di un videonoleggio è costituito da due vettori paralleli.
DettagliEsempio di Prova Scritta
Esempio di Prova Scritta La prova scritta è composta da alcuni esercizi per un totale di 10 punti (durata:circa 1h15 ). Le tipologie di esercizi possibili comprendono:! sintesi di una funzione ricorsiva/iterativa,
DettagliAlgoritmi di ordinamento: Array e ricorsione
Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1 Indice Algoritmi di ordinamento: Insertion
DettagliNote per la Lezione 6 Ugo Vaccaro
Progettazione di Algoritmi Anno Accademico 2016 2017 Note per la Lezione 6 Ugo Vaccaro Ancora sulla tecnica Programmazione Dinamica Nella lezione scorsa abbiamo appreso che la tecnica Divide-et-Impera,
DettagliFunzioni. Unità 1. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm
DettagliAlgoritmi esponenziali
Algoritmi esponenziali Algoritmi esponenziali Supponiamo che f(n) sia la funzione che rappresenta il numero di operazioni eseguite da un algoritmo e supponiamo che il tempo necessario per compiere una
Dettagli