4/25/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2010 13 –

Slides:



Advertisements
Presentazioni simili
Premessa: si assume di aver risolto (correttamente
Advertisements

UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA
Ricorrenze Il metodo di sostituzione Il metodo iterativo
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Procedure e funzioni ricorsive
ITIS LATTANZIO Unità Didattica Materia Informatica Funzioni in C++
Laboratorio Processi Stocastici
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Informatica Generale Marzia Buscemi
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Lez. 41 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Programmazione.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Iterazione enumerativa (for)
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Unintroduzione.
Università degli studi di LAquila Anno Accademico 2007/2008 Corso Integrato di Algoritmi e Strutture Dati con Laboratorio Modulo da 6 CFU di Algoritmi.
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
CORSO DI PROGRAMMAZIONE II
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati (Mod. B)
Introduzione alla Ricorsione
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
DEFINIZIONE DI NUOVE FUNZIONI & STRATEGIE DI COMPOSIZIONE La capacità di definire nuove funzioni permette: di definire nuove operazioni di introdurre variabili.
ITIS LATTANZIO Unità Didattica Materia Informatica Funzioni in C++
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Strutture dati per insiemi disgiunti
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Passo 3: calcolo del costo minimo
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.

3 aprile 2002 Avvisi: 1 o Esonero: mercoledi 17 aprile ore 11:30 – 14:00 consulta la pag. WEB alla voce esoneri si raccomanda la puntualita!
Ricorsione Strumento potente per definizioni matematiche
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Complessità di un algoritmo
Sessione live Testing. Esercizio Quesito 1 Soluzione 1.
11/21/2014E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo –
Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.
1/11/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo –
Ricorsione CORDA – Informatica A. Ferrari Testi da Alessandro Bugatti
3/31/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo – Algoritmi.
4/4/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo – Un.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
4/5/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo – Algoritmi.
La ricorsione.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
4/19/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo –
Allievi Elettrici - AA Le funzioni ricorsive in C
03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici.
Olimpiadi di Informatica 2010 Giornate preparatorie
1. 2 Una ricorsione si definisce non lineare quando si ha più di una chiamata ricorsiva per blocco Per capire bene come opera una ricorsione non lineare.
1 Informatica Generale Alessandra Di Pierro Ricevimento: Giovedì ore presso Dipartimento di Informatica, Via Buonarroti,
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Università degli.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Capitolo 1 Un’introduzione informale agli algoritmi Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Un’introduzione.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 6 – Invariante.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo La ricorsione 15 Approccio ricorsivo, esercizi sulla.
Transcript della presentazione:

4/25/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo – Programmazione dinamica: i numeri di Fibonacci. (versione 25/04/2015)

25/04/ E. Giovannetti - AlgELab Lez.282 I numeri rossi sulla Mole Antonelliana a Natale Che numeri sono ?

25/04/ E. Giovannetti - AlgELab Lez.283 I conigli di Leonardo di Pisa, figlio di Bonaccio. Leonardo Pisano, o Leonardo Fi(lius)bonacci all'istante 0, nessun coniglio: 0 coppie; alla fine del 1 o anno, compra 1 coppia di coniglietti; alla fine del 2 o anno: i coniglietti sono diventati conigli adulti: 1 coppia alla fine del 3 o anno: la coppia adulta genera una coppia di coniglietti: 2 coppie alla fine del 4 o anno: la coppia adulta genera una coppia di coniglietti: 3 coppie; i coniglietti dell'anno prima sono diventati adulti; alla fine del 5 o anno: le 2 coppie adulte generano ciascuna una coppia di coniglietti: 3+2 = 5 coppie;...

25/04/ E. Giovannetti - AlgELab Lez.284 Le regole della riproduzione dei conigli. Nessun coniglio muore mai (i conigli sono immortali). I conigli diventano adulti (e cominciano a riprodursi) soltanto al secondo anno di vita. Ogni coppia adulta genera 1 coppia di coniglietti all'anno, per sempre.

25/04/ E. Giovannetti - AlgELab Lez.285 (continua) Allora, dopo n anni: num. di coppie = num. di coppie esistenti 1 anno prima + num. di nuove coppie generate; ma: num. di nuove coppie = num. di coppie adulte 1 anno prima = = num. di coppie esistenti 2 anni prima quindi: num. di coppie = num. di coppie esistenti 1 anno prima + num. di coppie esistenti 2 anni prima.

25/04/ E. Giovannetti - AlgELab Lez.286 L'albero dei conigli La riproduzione dei conigli può essere descritta dall'albero seguente:

25/04/ E. Giovannetti - AlgELab Lez.287 I numeri rossi sulla Mole Antonelliana fib 0 = fib(0) = 0 fib(1) = 1 fib(n) = fib(n-1) + fib(n-2)

25/04/ E. Giovannetti - AlgELab Lez.288 L'n-esimo numero di Fibonacci: algoritmo ricorsivo long fib(int n) { if(n == 0) return 0; else if(n == 1) return 1; else return fib(n-1) + fib(n-2); } Tempo di calcolo: cresce esponenzialmente con n ! La funzione ricalcola molte volte gli stessi valori !

25/04/ E. Giovannetti - AlgELab Lez.289 Rappresentazione grafica delle eq. di ricorrenza (albero di ricorsione) + fib(n-1)fib(n-2) fib(n) = fib(1) 1 =

25/04/ E. Giovannetti - AlgELab Lez fib(n) = + fib(n-2)fib(n-3) + fib(n-4) liv. 0 liv. 1

25/04/ E. Giovannetti - AlgELab Lez fib(n) = + + fib(n-3)fib(n-4) + fib(n-5) + + fib(n-4)fib(n-5) + fib(n-6) liv. 0 liv. 1 liv. 2 liv. 3 eccetera

Ricorsione con memorizzazione. Memorizziamo i risultati delle chiamate ricorsive, e non ricalcoliamo i valori già calcolati in una chiamata precedente: int* ris; long fib(int n) { if(n == 0) return 0; if(n == 1) return 1; if(ris[n] == 0) ris[n] = fib(n-1) + fib(n-2); return ris[n]; } long fibmemo(int n) { ris = new int[n+1]; //for(int i = 0; i <= n; i++) ris[i] = 0; return fib(n); } 25/04/ E. Giovannetti - AlgELab Lez.2812

Iterazione Si può sostituire la ricorsione con l’iterazione; inoltre è sufficiente tenere solo i due ultimi numeri calcolati. L’algoritmo che così si ottiene è in realtà l’algoritmo che si ottiene direttamente pensando al modo in cui effettuiamo il calcolo noi esseri umani. 25/04/ E. Giovannetti - AlgELab Lez.2813

25/04/ E. Giovannetti - AlgELab Lez.2814 L'algoritmo intuitivo Infatti, se calcoliamo a mano la sequenza di Fibonacci, usiamo un ovvio algoritmo lineare: sommiamo i due ultimi numeri ottenuti, e otteniamo un nuovo ultimo numero della sequenza, ma non buttiamo via il precedente; invece la procedura ricorsiva, per calcolare fib(n-2) + fib(n-1) calcola due volte fib(n-2), a sua volta per calcolare fib(n-2) calcola due volte fib(n-4)... ripete inutilmente i calcoli ! Proviamo a implementare l'algoritmo "manuale" intuitivo per mezzo di una procedura iterativa.

25/04/ E. Giovannetti - AlgELab Lez.2815 L'n-esimo numero di Fibonacci: algoritmo iterativo. Per calcolare l'n-esimo numero occorre aver calcolato tutti i precedenti, e ad ogni passo si usano gli ultimi due. Servono allora tre variabili: i, ultimo, penult INVARIANTE ultimo è l' i -esimo numero di Fibonacci; penult è l'( i- 1)-esimo numero di Fibonacci. CORPO DEL CICLO ultimo + penult diventa il nuovo ultimo, il vecchio ultimo diventa il nuovo penult: nuovoUltimo = ultimo + penult; penult = ultimo; ultimo = nuovoUltimo; i++;

25/04/ E. Giovannetti - AlgELab Lez.2816 Test del ciclo Si esce quando i = n : in tal caso, evidentemente, ultimo è l'n-esimo numero di Fibonacci; quindi: while(i < n) Inizializzazione 0 è lo 0-esimo numero di Fibonacci; 1 è... l'1-esimo numero di Fibonacci; Allora, ricordando l'invariante: ultimo è l' i -esimo numero di Fibonacci, penult è l'( i- 1)-esimo numero di Fibonacci, si vede che l'inizializzazione deve essere: i = 1; penult = 0; ultimo = 1;

25/04/ E. Giovannetti - AlgELab Lez.2817 La procedura completa long fibonacci(int n) { long penult = 0; long ultimo = 1; if(n <= 0) return 0; for(int i = 1; i < n; i++) { long nuovoUltimo = ultimo + penult; penult = ultimo; ultimo = nuovoUltimo; } return ultimo; } osserva che vecchio ultimo è uguale a nuovoUltimo - penult quindi si potrebbe scrivere: long nuovoUltimo = ultimo + penult; penult = nuovoUltimo – penult; ultimo = nuovoUltimo;

25/04/ E. Giovannetti - AlgELab Lez.2818 La procedura completa static long fibonacci(int n) { long penult = 0; long ultimo = 1; if(n <= 0) return 0; for(int i = 1; i < n; i++) { long nuovoUltimo = ultimo + penult; penult = ultimo; ultimo = nuovoUltimo; } return ultimo; } osserva che vecchio ultimo è uguale a nuovoUltimo - penult quindi si potrebbe scrivere: long nuovoultimo = ultimo + penult; penult = nuovoultimo – penult; ultimo = nuovoUltimo;

25/04/ E. Giovannetti - AlgELab Lez.2819 L'n-esimo numero di Fibonacci: algoritmo iterativo. Versione finale. static long fibonacci(int n) { long penult = 0; long ultimo = 1; if(n <= 0) return 0; for(int i = 1; i < n; i++) { ultimo = ultimo + penult; penult = ultimo - penult;// = vecchio ultimo } return ultimo; }

25/04/ E. Giovannetti - AlgELab Lez.2820 La sequenza di Fibonacci: versione finale. Naturalmente se, come nel caso della Mole Antonelliana, vogliamo in output non solo l'n-esimo numero, ma l'intera sequenza dei primi n numeri di Fibonacci, non calcoliamo separatamente ogni numero ! PRECOND: n > 1 static long[] sequenzaDiFib(int n) { // sequenza degli n+1 numeri di Fibonacci da fib(0) a fib(n) n++; long[] a = new long[n]; a[0] = 0; a[1] = 1; for(int i = 2; i < n; i++) a[i] = a[i-1] + a[i-2]; return a; }

25/04/ E. Giovannetti - AlgELab Lez.2821 Numeri di Fibonacci arbitrariamente grandi Per superare la limitazione della dimensione fissa del tipo long, si può usare la classe BigInteger che permette di trattare interi di grandezza arbitraria (vedi docum. Java): static BigInteger bigFibonacci(int n) { BigInteger penult = ZERO; BigInteger ultimo = ONE; if(n <= 0) return ZERO; for(int i = 2; i <= n; i++) { ultimo = ultimo.add(penult); penult = ultimo.subtract(penult); } return ultimo; }

25/04/ E. Giovannetti - AlgELab Lez.2822 Esercizio Si scriva una versione della procedura sequenzaDiFib che restituisca un array di BigInteger.

25/04/ E. Giovannetti - AlgELab Lez.2823 Osservazione Ciò vuol dire che la versione ricorsiva di un algoritmo può avere complessità asintoticamente peggiore della versione iterativa ? NO ! Nonostante le apparenze, l'algoritmo ricorsivo è un algoritmo DIVERSO da quello iterativo. Il fatto è che l'algoritmo ricorsivo PIÙ NATURALE è esponenziale.