Ricorsione. Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona.



Documenti analoghi
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

La ricorsione. Politecnico di Milano Sede di Cremona

Ricorsione. Corso di Fondamenti di Informatica

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

AA LA RICORSIONE

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Algoritmi di Ricerca. Esempi di programmi Java

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

10 - Programmare con gli Array

Allocazione dinamica della memoria - riepilogo

GESTIONE INFORMATICA DEI DATI AZIENDALI

Oggetti Lezione 3. aspetti generali e definizione di classi I

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Funzioni in C. Violetta Lonati

La selezione binaria

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercitazioni di Progettazione del Software. Esercitazione (Prova al calcolatore del 17 settembre 2010)

Il tipo di dato astratto Pila

Riferimenti ed Oggetti

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Java: Compilatore e Interprete

Esercizi Capitolo 6 - Alberi binari di ricerca

Concetto di Funzione e Procedura METODI in Java

Tipi di Dato Ricorsivi

Ricorsione. (da lucidi di Marco Benedetti)

Programmazione I - Laboratorio

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

Programmazione dinamica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

dall argomento argomento della malloc()

Corso di Tecniche di Programmazione

Corso di Informatica

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

4 3 4 = 4 x x x 10 0 aaa

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

INFORMATICA 1 L. Mezzalira

Realizzazione di una classe con un associazione

Introduzione alla tecnica di Programmazione Dinamica

costruttori e distruttori

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

Esercizi della lezione 5 di Java

Prova di Laboratorio di Programmazione

Programmazione in Java Parte I: Fondamenti

Gestione dinamica di una pila

Telematica II 17. Esercitazione/Laboratorio 6

Sistemi Operativi. 5 Gestione della memoria

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Protezione. Protezione. Protezione. Obiettivi della protezione

Ricerca Automatica. Esercitazione 3. Ascensore. Ascensore. Ascensore

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

Funzioni - Parte II. 1 Composizione di Funzioni. Antonio Lazzarini. Prerequisiti: Funzioni (Parte I).

Esempi di algoritmi. Lezione III


Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

Pila di interi. Car 1. Car n. Pila di interi: Pila di Oggetti: Gli elementi che sono inseriti e tolti dalla pila sono numeri interi

Informatica 3. LEZIONE 21: Ricerca su liste e tecniche di hashing. Modulo 1: Algoritmi sequenziali e basati su liste Modulo 2: Hashing

Java Virtual Machine

L algoritmo di ricerca binaria. Daniele Varin LS Ing. Informatica Corso di Informatica teorica Docente: prof. Paolo Sipala

Le variabili. Olga Scotti

I tipi di dato astratti

Intelligenza Artificiale

Elementi di Informatica

Richiesta pagina PHP (es: index.php)

Prolog: aritmetica e ricorsione

Esercitazione n 4. Obiettivi

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

1 introdurre le monete per l importo necessario. 2 selezionare la quantità di zucchero. 3 selezionare la bevanda desiderata

Definizione di classi con array di oggetti

SAPIENZA Università di Roma, Facoltà di Ingegneria

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Introduzione ai tipi di dato astratti: applicazione alle liste

Funzioni e procedure

Esercizio 1: trading on-line

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Inizializzazione, Assegnamento e Distruzione di Classi

La gestione della memoria

Ricorsione. Rosario Culmone. - p. 1/13

Variabili e tipi di dato

Capitolo 2. Operazione di limite

Programmazione ad oggetti

Java threads (2) Programmazione Concorrente

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

FONDAMENTI di INFORMATICA L. Mezzalira

Corso sul linguaggio Java

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio

Transcript:

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Sommario Implementazione di Utilizzo ricorsione per processare dati in java vs. multipla

Algoritmi Ricorsivi Algoritmo Ricorsivo: richiama se stesso Tecnica di programmazione molto elegante e semplice da realizzare Tipicamente meno eciente dell'iterazione (gestione chiamate ricorsive) Particolarmente adatta per domini deniti induttivamente.

Domini deniti induttivamente Caratterizzazione induttiva degli elementi del dominio 1 Un numero nito di elementi appartengono al dominio 2 Un numero nito di regole se applicate ad un sottoinsieme degli elementi del dominio restituiscono elementi appartenenti al dominio stesso 3 Solo gli elementi cosí deniti appartengono al dominio. Example (Numeri naturali N) 1 0 appartiene ad N 2 se n N allora il successore di n appartiene ad N 3 niente altro appartiene ad N

e domini deniti induttivamente su domini deniti induttivmente puó manipolare ed elaborare in maniera molto conveniente gli elementi di un dominio denito induttivamente. Example (Fattoriale) fatt(n) = { 1, if n = 0 (caso base) n fatt(n 1), if n > 0 (caso ricorsivo)

Calcolo di ricorsive Schema generale La denizione ricorsiva ricalca la struttura della denizione induttiva del dominio su cui opera la funzione. 1 uno (o più) casi base, per i quali il risultato può essere determinato direttamente; 2 uno (o più) casi, per i quali si riconduce il calcolo del risultato al calcolo della stessa funzione su un valore più piccolo/semplice. Dominio denito induttivamente prima o poi arriviamo ad uno dei casi base.

in Scrivere programmi in In la ricorsione e' supportata in maniera diretta: funzione puo' richiamare se stessa Example (Fattoriale Ricorsivo in ) public static long fatt(int n) { if(n==0){ return 1; else { return n*fatt(n-1); una

Somma Ricorsiva Somma ricorsiva in Denizione ricorsiva: { x, if y = 0 (caso base) somma(x, y) = 1 + somma(x, y 1), if y > 0 (caso ricorsivo) Example (Somma Ricorsiva in ) public static int sommaricorsiva(int x, int y) { if(y==0){ return x; else { return 1 + sommaricorsiva(x,y-1);

Esercizi Esercizio Implementare i moltiplicazione ricorsiva potenza ricorsiva della classe FuzioniRicorsive.java.

dati utilizzando la ricorsione Schema processamento dati ricorsivo Calcolare l'operazione op per la collezione di elementi C se C e' vuota return elemento neutro di op altrimenti { return primo elemento op risultato chiamata ricorsiva

Ricerca di un elemento utilizzando la ricorsione Schema ricerca ricorsiva Ricerca dell'elemento x nell'insieme S se l'insieme e' vuoto return false altrimenti { return (primo elemento == elemento cercato) or elemento presente resto insieme

Esempio: ricerca di un intero in un le di interi Ricerca ricorsiva private static boolean trovaricorsivoinput(int e, BufferedReader br) throws IOException { String line = br.readline(); if (line == null){ return false; else { int x = Integer.valueOf(line); return ((x == e) trovaricorsivoinput(e,br))

Esempio: ricerca di un carattere in una stringa Ricerca ricorsiva stringa private static boolean trovaricorsivostringa(char c, String string) { System.out.println("trova ricorsivo: processo la stringa:"+string); if (string.length() == 0){ return false; else { return ((c == string.charat(0)) trovaricorsivostringa(c, string.substring(1)));

Conteggio di elementi utilizzando la ricorsione Schema conteggio ricorsivo Contare occorrenze di x nel multi insieme M se l'insieme e' vuoto return 0 altrimenti { se il primo elemento e' l'elemento cercato return 1 + numero occorrenze resto insieme; else { return numero di occorrenze resto insieme

Esercizi Esercizi processare la ricorsione Implementare i 1 contaricorsivoinput 2 contaricorsivostringa 3 massimoricorsivoinput della classe ProcessaDati.java Scaricare il le interi.txt

Confronto tra iterazione e ricorsione vs. ricorsione Tutti i possono essere implementati in maniera iterativa simulando la ricorsione con apposite strutture dati (pile). Alcuni possono essere implementati in maniera iterativa direttamente Metodi iterativi piu' ecienti: non dobbiamo gestire le chiamate delle ricorsive.

Calcolo Fattoriale Iterativo Example (fattoriale iterativo) public static long fattiter(int n) { long ris = 1; while(n>0){ ris = ris * n; n--; return ris;

Esempio: copia inversa Example (Copia inversa) Vogliamo leggere una serie di interi da input e stamparli dall'ultimo al primo public static void copiainversa(scanner sc){ if (sc.hasnextint()){ int a = sc.nextint(); copiainversa(sc); System.out.println(a);

Copia inversa: discussione Tail recursion Copia inversa non puo' essere tradotta direttamente in un metodo iterativo Dierenza fondamentale dai visti no ad ora: chiamata ricorsiva non e' l'ultima istruzione del metodo tail recursion. tail recursion alcuni compilatori traducono direttamente con tail recursion in iterativi (piu' ecienti).

Copia inversa: i record di attivazione e Record di Attivazione Per tradurre copia inversa in un metodo iterativo abbiamo bisogno di una struttura di appoggio apposita (pila) per le righe lette Questa struttura e' direttamente disponibile ai grazie ai Record di attivazione

Gestione memoria a run time Gestione memoria di lavoro della JVM zona che contiene il bytecode (ovvero il codice eseguibile dalla JVM) - determinata a tempo di esecuzione al momento del caricamento della classe dimensione ssata per ogni metodo a tempo di compilazione heap: zona di memoria che contiene gli oggetti cresce e descresce dinamicamente durante l'esecuzione allocazione/deallocazione oggetti pila dei record di attivazione (o stack): zona di memoria per i dati locali alle (variabili e parametri) - cresce e descresce dinamicamente durante l'esecuzione viene gestita con un meccanismo a pila

Heap e garbage collection Gestione Heap della JVM In Il programmatore non gestisce direttamente lo Heap Allocazione memoria: Un oggetto viene creato tramite l'operatore new e la chiamata al costruttore. La zona di memoria per l'oggetto stesso viene riservata nello heap. Deallocazione memoria: Quando un oggetto non è più utilizzato da un programma, la zona di memoria può essere liberata e resa disponibile per nuovi oggetti Operazione eettuata automaticamente dal garbage collector, quando l'oggetto non è più accessibile.

Deallocazione automatica della memoria Garbage Collector Componente JVM che decide quando un oggetto non e' piu' utilizzabile: quando non ci sono piu' riferimenti attivi. Invocato automaticamente dalla JVM L'invocazione del GC puo' essere forzata dal programmatore: System.gc()

Pila di record di attivazione Gestione pila RdA Pila (o stack): struttura dati accesso LIFO: Last In First Out La JVM gestisce i RdA con una pila: ogni attivazione di metodo genera un nuovo RdA posto in cima alla pila al termine dell'attivazione del metodo il RdA viene rimosso dalla pila

Informazioni RdA Informazioni associate a ciascun RdA Ogni RdA contiene informazioni necessarie all'attivazione del metodo locazioni di memoria per parametri formali (incluso eventuale riferimento all'oggetto di invocazione) locazioni di memoria per le variabili locali il valore di ritorno dell'invocazione del metodo indirizzo di ritorno: indirizzo della locazione di memoria dove e' memorizzata la prossima istruzione da eseguire nel metodo chiamante Example (evoluzione record di attivazione ) Vedere le outputrda.txt (esecuzione di EsempioRdA.java)

Esempio copia inversa Gestione RdA gli interi sono memorizzate tramite occorrenze successive della variabile a nei RdA. Pila RdA: struttura dati temporanea nella quale memorizzare gli interi Implementazione iterativa leggere tutti gli interi e memorizzarli, prima di stampare. Servirebbe quindi una struttura dati addizionale (non avendo pila RdA ricorsiva).

Esempio: interi simmetrici denizione problema Data una sequenza di interi tutti positivi tranne per uno 0 in posizione centrale. La sequenza e' simmetrica se coincide con la sequenza invertita Dato un le con una sequenza di interi, uno per riga, con uno zero in posizione centrale. Determinare se il le rappresenta una sequenza simmetrica.

Esempio: interi simmetrici caratterizzazione ricorsiva La sequenza costituita solo da 0 e' simmetrica Una sequenza n s m e' simmetrica se s e' una sequanza simmetrica ed n ed m sono due interi positivi uguali. niente altro e' una sequenza simmetrica.

Esempio: interi simmetrici codice soluzione private static boolean interisimmetrici(bufferedreader br) throws IOException { String line = br.readline(); int n = Integer.valueOf(line); if (n==0){ return true; else { boolean sim = interisimmetrici(br); String line2 = br.readline(); int m = Integer.valueOf(line2); return ((sim) && (m == n));

Esercizi Esercizi ricorsione avanzata Implementare i seguenti interiinversi stringapalindroma della classe Avanzata.java Nota: per eseguire il main e vericare la corretta esecuzione del programma scaricare i le copiainversa.txt interinonsimmetrici.txt (opzionale interisimmetrici.txt) interiinversi.txt

La multipla Denizione Si ha ricorsione multipla quando l'attivazione di un metodo puo' causare piu' di un attivazione ricorsiva dello stesso metodo. Example (calcolo dell'n-esimo numero di Fibonacci) Stima del numero di individui di una popolazione al variare delle generazioni F (n) numero individui alla generazione n-esima. 0, if n = 0 (caso base) F (n) = 1, if n = 1 (caso base) F (n 2) + F (n 1), if n > 1 (caso ricorsivo)

La multipla in Example (calcolo dell'n-esimo numero di Fibonacci in ) private static int fibonacci(int n) { if (n==0){ return 0; else if (n==1){ return 1; else { return fibonacci(n-2) + fibonacci(n-1);

Esempio Torre Hanoi Il problema della torre di Hanoi Dati tre perni ed n dischi di dimensione crescente Situazione iniziale: tutti i dischi sono posizionati su un perno 1 (ciascun disco poggia sempre su un disco piu' grande) Obiettivo: spostare tutti i dischi sul perno 2 usando il perno 3 come appoggio Regole: 1 Tutti i dischi (tranne quello spostato) debbono essere posizionati in uno dei tre perni. 2 Si puo' spostare un solo disco alla volta, dalla cima di una torre ad un altro perno. 3 Un disco non puo' mai poggiare su un disco piu' piccolo.

Esempio Torre Hanoi Torre Hanoi soluzione ricorsiva per spostare n > 1 dischi da 1 a 2, usando 3 come appoggio: sposta n - 1 dischi da 1 a 3 sposta l'n-esimo disco da 1 a 2 sposta n - 1 dischi da 3 a 2 un solo disco puo' essere spostato direttamente.

Numero attivazioni Numero attivazioni di una metodo ricorsivo per ricorsione multipla Quando si utilizza la ricorsione multipla il numero di attivazioni di un metodo potrebbe essere esponenziale. Esponenziale nella profondita' delle chiamate ricorsive (altezza massima pila RdA) Esempio Torre Hanoi: att(n) = numero di attivazioni del metodo ricorsivo che risolve una torre di hanoi di n dischi att(n) = { in generale att(n) > 2 (n 1) 1, if n = 1 (caso base) 1 + 2 att(n 1), if n > 1 (caso base) Nota: nel caso della torre di hanoi il numero esponenziale di attivazioni e' una caratteristica del problema non esiste una soluzione migliore

Numero attivazioni Fibonacci ricorsivo Calcolo n-esimo numero di Fibonacci Si dimostra che attfibo(n) > 2 n/2 per n > 1 Utilizzando le equazioni di ricorrenza ed il metodo di soluzione iterativo Quindi il metodo di Fibonacci ricorsivo ha costo (almeno) esponenziale Il problema di calcolare l'n-esimo numero di Fibonacci ha una soluzione migliore (lineare in n)

Esercizio: torre Hanoi Implementare soluzione torre hanoi ricorsiva in java Vogliamo realizzare un programma che stampa la sequenza di spostamenti da fare per risolvere una torre di hanoi di n dischi. Per ogni spostamento vogliamo stampare un testo del tipo: muovi un disco dal perno x al perno y implementare il metodo public static void muovi(int dischi, int sorg, int dest, int aux) della classe.java. Utilizzare il metodo muoviundisco(...) della stessa classe.