Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

INFORMATICA Algoritmi fondamentali
I numeri naturali ….. Definizione e caratteristiche
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
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
Informatica Generale Marzia Buscemi
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Lez. 41 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Programmazione.
Anno accademico Array e puntatori in C.
Alberi binari di ricerca
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Iterazione enumerativa (for)
Esercizi su alberi binari
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Il problema della ricerca Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
Corso di Laurea in Biotecnologie Informatica (Programmazione)
CORSO DI PROGRAMMAZIONE II
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Dott.ssa.
Esercizi su alberi binari
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Strutture di controllo in C -- Flow Chart --
La Programmazione Ricorsiva
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Elementi di Informatica di base
Sistemi e Tecnologie Informatiche
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ò.
1 Questionario di soddisfazione ATA - a. sc. 2008/09 Il questionario è stato somministrato nel mese di aprile Sono stati restituiti 29 questionari.
Programmazione di Calcolatori
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
14 marzo 2002 Avvisi:.
Tail recursion: esempio
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
Teoria degli algoritmi e della computabilità Terza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione.
ALGORITMI a.
PROGRAMMAZIONE IN LOGO
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 1 Cicli ed asserzioni Corso di Informatica 2 a.a. 2003/04 Lezione 1.
Sistemi e Tecnologie Informatiche
Array (ordinamento) CORDA – Informatica A. Ferrari.
alberi completamente sbilanciati
ALGORITMI DI RICERCA Nella programmazione s’incontra spesso la necessità di ricercare un elemento (chiave) in un elenco, oppure di ordinare gli elementi.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
Sistemi e Tecnologie Informatiche Verifica di correttezza di un programma.
Corso JAVA Lezione n° 03 Istituto Statale di Istruzione Superiore “F. Enriques”
La ricorsione.
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Il problema della ricerca Algoritmi e Strutture Dati.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Sistemi e Tecnologie Informatiche Complessità di calcolo.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo La ricorsione 15 Approccio ricorsivo, esercizi sulla.
Transcript della presentazione:

Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo

Nella lezione precedente … … abbiamo imparato che: E’ possibile adoperare l’algoritmo di ricerca sequenziale per individuare le occorrenze di un elemento all’interno di una lista Tale algoritmo può rivelarsi estremamente inefficiente poichè richiede sino ad n confronti (dove n è pari alla taglia della lista) per individuare un elemento L’algoritmo di ricerca binaria migliora le prestazioni dell’algoritmo di ricerca sequenziale a patto che l’elenco di input sia stato precedentemente ordinato L’algoritmo di ricerca binaria impiega sino a log(n) confronti per individuare un elemento

In questa lezione … … impareremo che: L’algoritmo di ricerca binaria adotta una strategia risolutiva che può essere applicata anche ad altri problemi e che va sotto il nome di ricorsione Esistono differenti tipi di ricorsione Non sempre l’approccio ricorsivo è quello migliore

Mistero … Cerca elem nel vettore Voti[0 … n-1] Sia Voti l’elenco di input, n la taglia dello stesso ed elem l’elemento cercato Sia i l’indice dell’elemento attualmente considerato, inizialmente i = 0 Ripeti per n-1 volte o fino a che Voti[i] è uguale ad elem Considera il prossimo elemento (i=i+1) Se Voti[i] è uguale ad elem restituisci i altrimenti restituisci -1 Cerca elem nel vettore ordinato Voti[inf … sup] Se l’array è vuoto (inf>sup) la ricerca termina (ritorna -1) Considera l’elemento nella posizione centrale (med=(inf+sup)/2) Se elem è uguale a Voti[med] la ricerca termina (ritorna med) Altrimenti, se elem è minore di Voti[med] cerca elem nel vettore Voti[inf … med -1] Altrimenti, cerca elem nel vettore Voti[med+1 … sup] Dove si trovano i log(n) confronti dell’algoritmo di ricerca binaria???

Ricerca binaria Problema 1: Ricercare l’elemento 26 all’interno del vettore A[0…9] Problema 2: Ricercare l’elemento 26 all’interno del vettore A[5…9] Problema 3: Ricercare l’elemento 26 all’interno del vettore A[5…6] Risposta problema 3: L’elemento si trova alla posizione 5! Risposta problema 2: L’elemento si trova alla posizione 5! Risposta problema 1: L’elemento si trova alla posizione 5!

Procedure ricorsive L’algoritmo di ricerca binaria è un tipico esempio di procedura ricorsiva Una procedura si dice ricorsiva quando all’interno della sua definizione compare un riferimento alla procedura stessa (e.g. La funzione PosizioneElemento(0,9,Voti,22) esegue al suo interno la funzione PosizioneElemento(0,4,Voti,22)) Affinchè l’esecuzione di una procedura ricorsiva finisca è prevista l’esistenza di una condizione di terminazione (e.g. La ricerca binaria di un elemento si arresta quando l’array è vuoto) La ricorsione ci consente la risoluzione di problemi complessi a parte da problemi più elementari

E’ possibile implementare una procedura ricorsiva in C/C++ attraverso le chiamate a funzione PosizioneElemento invoca se stessa quando la taglia dell’elenco in input è diversa da zero (condizione di ricorsione) PosizioneElemento termina quando la taglia dell’elenco in input è zero (condizione di terminazione) int PosizioneElemento(int inf, int sup, int Voti[], int elem) { /* Effettua la ricerca binaria di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ if ( inf>sup) // Verifichiamo se esistono elementi da considerare return -1; else{ int med = (int) (inf + sup) / 2; if (Voti[med] == elem) return med; // L’elemento è stato individuato else if (elem < Voti[med]) { sup = med -1; // Cerchiamo nella porzione di sinistra return PosizioneElemento(inf, sup, Voti, elem); } else{ inf = med + 1; // Cerchiamo nella porzione di destra return PosizioneElemento(inf, sup, Voti, elem); } } } /* PosizioneElemento */

Ricerca binaria Sia dato in input il vettore Voti[0…9] e l’elemento 26 PosizioneElemento(0,9,Voti,26) L’elemento centrale (Voti[4]) è minore dell’elemento cercato, proseguiamo la ricerca in Voti[5…9] PosizioneElemento(5,9,Voti,26) L’elemento centrale (Voti[7]) è maggiore dell’elemento cercato, proseguiamo la ricerca in Voti[5…6] PosizioneElemento(5,9,Voti,26) L’elemento centrale (Voti[5]) è uguale all’elemento cercato, restituiamo il suo indice 5 int PosizioneElemento(int inf, int sup, int Voti[], int elem) { if ( inf>sup) // Verifichiamo se esistono ancora elementi return -1; else{ int med = (int) (inf + sup) / 2; if (Voti[med] == elem) return med; // L’elemento è stato individuato else if (elem < Voti[med]) { sup = med -1; // Cerchiamo nella porzione di sinistra return PosizioneElemento(inf,sup,Voti, elem); } else{ inf = med + 1; // Cerchiamo nella porzione di destra return PosizioneElemento(inf, sup, Voti, elem); } } } /* PosizioneElemento */

Ricorsione Esistono due tipi di ricorsione: Ricorsione diretta: All’interno della procedura A compare esplicitamente la chiamata a se stessa Ricorsione indiretta All’interno della procedura A viene invocata una seconda procedura B che a sua volta invoca A

Ricorsione diretta Immaginiamo di disporre di un computer capace di sommare solo due valori per volta Problema: Scrivere una funzione ricorsiva Somma capace di addizionare un numero arbitrario di valori Osservazione: Somma(x,y,z,w) = Somma(x,y,z) + w Algoritmo risolutivo: Somma(x 1,…,x n-1,x n ) if (n > 2) return Somma(x 1,…,x n-1 ) + x n else if (n == 2) return x 1 + x 2 else return x 1

Ricorsione diretta La funzione Somma sa addizionare esclusivamente due numeri Se i valori da sommare sono n, con n maggiore di 2, si sommano “a parte” i primi n-1 numeri, il totale viene sommato al numero n-simo = Somma(7,3,9,6) + 2 = Somma(7,3,9,6) = Somma(7,3,9) + 6 = Somma(7,3,9) = Somma(7,3) + 9 = Somma(7,3) = = = = Somma(7,3,9,6,2)

Ricorsione indiretta Immaginiamo di disporre di un calcolatore incapace di operare divisioni Problema: Ideare una funzione ricorsiva Pari capace di dirci se un numero è pari o meno Osservazione: x è pari se e solo se x-1 è dispari Algoritmo risolutivo: Pari(x) if x == 0 return true else return Dispari(x-1) Dispari(y) if y == 0 return false else return Pari(x-1)

Ricorsione indiretta Dato x in input, la funzione Pari restituisce vero se e soltanto se la funzione Dispari(x-1) restituisce vero Dato y in input, la funzione Dispari restituisce vero se e soltanto se la funzione Pari(y-1) restituisce vero Pari(0) restituisce vero Dispari(0) restituisce falso Pari(5) è vero se e solo se Dispari(4) è vero Dispari(4) è vero se e solo se Pari(3) è vero Pari(3) è vero se e solo se Dispari(2) è vero Dispari(2) è vero se e solo se Pari(1) è vero Pari(1) è vero se e solo se Dispari(0) è vero Dispari(0) è falso

Numeri Fibonacci I numeri di Fibonacci provengono da una successione numerica definita dalla seguente relazione: Fib(n) = Fib(n-1) + Fib(n-2) Fib(0) = 1 Fib(1) = 1 E.g., Fib(2) = Fib(1) + Fib(0) = = 2 Fib(6) = Fib(5) + Fib(4) = Fib(4) + Fib (3) + Fib(4) = … = 13

Numeri Fibonacci Fib(5) Fib(4) Fib(3) Fib(1)Fib(2) Fib(1)Fib(0) Fib(3) Fib(1)Fib(2) Fib(0)Fib(1) Fib(2) Fib(0)Fib(1) Calcolare il numero di Fibonacci associato a 5

Numeri Fibonacci La strategia ricorsiva non sempre è quella migliore Nel caso dei numeri di Fibonacci essa si rivela inefficace poichè costringe a ricalcolare numerose volte gli stessi risultati Il numero di esecuzioni della procedura Fibonacci calcolata sul valore n è circa 2 n

Numeri Fibonacci – strategia iterativa Fib(5) Fib(4) Fib(3) Fib(2) Fib(1) Fib(0) Introduciamo un array Fib di taglia n per memorizzare il valore dei numeri di Fibonacci già calcolati Sia dato un numero x in input (e.g., 5) Calcoleremo il numero di Fibonacci associato ad x a partire dagli elementi più piccoli, memorizzando e riutlizzando i valori già calcolati

Esercizio Immaginiamo di disporre di un calcolatore capace esclusivamente di sommare o sottrarre 1 ad un qualsiasi valore numerico Problema: Come è possibile implementare la somma di una coppia di numeri qualsiasi? E.g., ?