21 - Alberi e Ricorsione

Documenti analoghi
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

5 - Istruzioni condizionali

14 - Metodi e Costruttori

18 - Classi parzialmente definite: Classi Astratte e Interfacce

Algoritmi di Ricerca. Esempi di programmi Java

Alberi binari e alberi binari di ricerca

Alberi e alberi binari I Un albero è un caso particolare di grafo

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Definizione di metodi in Java

Heap e code di priorità

Programmazione I - Laboratorio

Esercizi di Algoritmi e Strutture Dati

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

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

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

Note per la Lezione 4 Ugo Vaccaro

10 - Programmare con gli Array

Programmazione I - Laboratorio

Alberi ed Alberi Binari

Funzioni, Stack e Visibilità delle Variabili in C

Strutture dati dinamiche in C (II)

22 - Strutture Dati (Java Collections Framework)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Roadmap. Ricorsione: funzioni ricorsive. Definizione di fattoriale. Definizione dei numeri Fibonacci

Esercizi di Algoritmi e Strutture Dati

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

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Cammini minimi fra tutte le coppie

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

8 - Stringhe (e altre classi dalla Libreria Standard di Java)

IEIM Esercizio: L albero Genealogico

Algoritmi di Ricerca. Esempi di programmi Java

Compito di Programmazione, 22 marzo 2007 INFORMATICI E MULTIMEDIALI

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Array multidimensionali e stringhe

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione 1 A.A. 2015/2016

Esercizi della lezione 5 di Java

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Codice Gray. (versione Marzo 2007)

Costo di esecuzione e complessità. Modello di costo e complessità di un algoritmo

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

Tempo e spazio di calcolo (continua)

Per semplicità eliminiamo le ripetizioni nell'albero.

Esercizi per la prova in itinere (con soluzioni)

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

Programmazione I - Laboratorio

Problemi, istanze, soluzioni

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

Matlab. Istruzioni condizionali, cicli for e cicli while.

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Algoritmi e Strutture Dati. HeapSort

Strutture dati e loro organizzazione. Gabriella Trucco

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

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

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

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

Allocazione Dinamica della Memoria

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Uso di metodi statici. Walter Didimo

Laboratorio di Programmazione 1 [Java]

ADT Coda con priorità

Esercitazione 6. Alberi binari di ricerca

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Esercizi sui metodi. Carla Limongelli. Maggio Esercizi 1

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

Transcript:

21 - Alberi e Ricorsione Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea Magistrale in Informatica Umanistica A.A. 2013/2014 Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 1 / 40

Altre strutture dati... In certe situazioni gli array, i vettori e le altre strutture dati fornite dalla Libreria di Java non sono semplici da usare... Esempio: albero genealogico Supponiamo di voler scrivere un programma che gestisce un albero genealogico Abbiamo un individuo, di cui dobbiamo indicare i genitori, i nonni, i bisnonni, ecc... Possiamo assumere di rappresentare l individuo tramite un oggetto Il metodo setgenitori consente di specificare i genitori dell individuo I genitori saranno a loro volta individui... di cui si potranno specificare i genitori, ecc... Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 2 / 40

Albero genealogico (1) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 3 / 40

Albero genealogico (2) Come deve essere fatta la classe Individuo? Deve prevedere una stringa per il nome dell individuo Deve prevedere riferimenti ai due individui genitori ossia, due variabili di tipo Indiviuo Quindi: la classe Individuo conterrà riferimenti a oggetti della stessa classe! Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 4 / 40

Albero genealogico (3) public class Individuo { // nome dell individuo private String nome ; // riferimento al padre ( di tipo Individuo ) private Individuo padre ; // riferimento alla madre ( di tipo Individuo ) private Individuo madre ; // costruttore : inizializza solo il nome public Individuo ( String nome ) { // padre e madre inizializzati di default a null this. nome = nome ; ( segue ) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 5 / 40

Albero genealogico (4) ( segue Individuo ) // restituisce il nome public String getnome () { return nome ; // restituisce l individuo padre public Individuo getpadre () { return padre ; // imposta il padre ( se non ancora impostato ) public void setpadre ( Individuo padre ) { if ( this. padre == null ) this. padre = padre ; // restituisce l individuo madre public Individuo getmadre () { return madre ; // imposta la madre ( se non ancora impostata ) public void setmadre ( Individuo madre ) { if ( this. madre == null ) this. madre = madre ; Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 6 / 40

Albero genealogico (5) Come si usa? Vediamo un main... public class UsaAlberoGenealogico { public static void main ( String [] args ) { Individuo bart = new Individuo (" Bart Simpson "); Individuo marge = new Individuo (" Marge Bouvier "); bart. setmadre ( marge ); Individuo homer = new Individuo (" Homer Simpson "); bart. setpadre ( homer ); Individuo nonno1 = new Individuo (" Abraham Simpson "); homer. setpadre ( nonno1 ); // nota : metodo invocato su homer! Individuo nonna1 = new Individuo (" Mona Simpson "); homer. setmadre ( nonna1 ); // nota : metodo invocato su homer! Individuo nonno2 = new Individuo (" Clancy Bouvier "); marge. setpadre ( nonno2 ); // nota : metodo invocato su marge! Individuo nonna2 = new Individuo (" Jacqueline Bouvier "); marge. setmadre ( nonna2 ); // nota : metodo invocato su marge! Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 7 / 40

Albero genealogico (6a) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 8 / 40

Albero genealogico (6b) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 9 / 40

Albero genealogico (6c) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 10 / 40

Albero genealogico (6d) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 11 / 40

Albero genealogico (6e) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 12 / 40

Albero genealogico (7) E se volessimo stampare l albero genealogico (tramite un nuovo metodo stampaalberogenealogico())? Ad esempio, cercando di ottenere questo risultato: Bart Simpson -- Homer Simpson ---- Abraham Simpson ---- Mona Simpson -- Marge Simpson ---- Clancy Bouvier ---- Jacqueline Bouvier Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 13 / 40

Albero genealogico (8) Per poter stampare l albero genealogico di un individuo, il metodo stampaalberogenealogico() dovrebbe: Ma... stampare il nome dell individuo su cui è chiamato stampare l albero genealogico del padre stampare l albero genealogico della madre anche il padre e la madre sono individui... la funzionalità di stampa dell albero genealogico di un individuo la stiamo definendo ora... questo è un cane che si morde la coda... Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 14 / 40

Albero genealogico (9) Tutto sotto controllo! Il metodo stampaalberogenealogico() che stiamo definendo è ricorsivo al suo interno richiama se stesso! // nuovo metodo della classe Individuo public void stampaalberogenealogico () { System. out. println ( nome ); if ( padre!= null ) padre. stampaalberogenealogico (); if ( madre!= null ) madre. stampaalberogenealogico (); // utilizzo del metodo ( aggiunto in fondo al main ) bart. stampaalberogenealogico (); Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 15 / 40

Albero genealogico (10) Attenzione: il controllo padre!=null (analogo per madre) serve per due motivi: se il padre (o la madre) è null non abbiamo niente da stampare per quanto lo riguarda se la variabile padre è null, il comando padre.stampaalberogenealogico() da un errore a tempo di esecuzione eccezione NullPointerException Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 16 / 40

Albero genealogico (11) Risultato: Bart Simpson Homer Simpson Abraham Simpson Mona Simpson Marge Bouvier Clancy Bouvier Jacqueline Bouvier Mancano i trattini prima dei nomi degli avi! Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 17 / 40

Albero genealogico (11) Proviamo a modificare il metodo... // nuovo metodo della classe Individuo public void stampaalberogenealogico () { System. out. println ( nome ); if ( padre!= null ) { System. out. print (" --"); padre. stampaalberogenealogico (); if ( madre!= null ) { System. out. print (" --"); madre. stampaalberogenealogico (); Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 18 / 40

Albero genealogico (12) Risultato: Bart Simpson -- Homer Simpson -- Abraham Simpson -- Mona Simpson -- Marge Bouvier -- Clancy Bouvier -- Jacqueline Bouvier Non ci siamo ancora... Il numero di trattini che devono essere stampati in ogni riga dipende da quanto vecchio è l individuo ossia, da quanto è lontano dall individuo radice dell albero (bart) Soluzione: aggiungere un contatore da passare da un individuo ai suoi genitori incrementandolo ogni volta Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 19 / 40

Albero genealogico (13) Nuovo tentativo... Ora il metodo ricorsivo prevede anche un parametro intero (il contatore) // nuovo metodo della classe Individuo public void stampaalberogenealogico ( int contatore ) { // stampa tanti trattini quanti indicati da contatore for ( int i =0; i< contatore ; i ++) System. out. println (" --"); System. out. println ( nome ); // chiamate ricorsive con contatore aumentato if ( padre!= null ) padre. stampaalberogenealogico ( contatore +1); if ( madre!= null ) madre. stampaalberogenealogico ( contatore +1); Modifichiamo anche la chiamata nel main // all inizio il contatore e 0 ( non servono trattini per bart ) bart. stampaalberogenealogico (0); Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 20 / 40

Albero genealogico (14) Risultato: Bart Simpson -- Homer Simpson ---- Abraham Simpson ---- Mona Simpson -- Marge Bouvier ---- Clancy Bouvier ---- Jacqueline Bouvier Ci siamo! Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 21 / 40

La struttura dati Albero (1) La struttura dati che abbiamo usato per realizzare l albero genealogico prende il nome di Albero Un albero: E costituito da nodi (in Java sono oggetti) tra i quali esiste una relazione padre-figlio Ha un nodo radice (senza padri) Ha nodi foglia (senza figli) Un sottoalbero è una porzione di un albero che consiste di un nodo intermedio e tutti i suoi discendenti. Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 22 / 40

La struttura dati Albero (2) Il numero di figli di ogni nodo di un albero può essere fiassato o variabile Quando il numero dei figli di ogni nodo è fissato a 2, l albero si dice binario (come nell esempio dell albero genealogico) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 23 / 40

La struttura dati Albero (3) Quando il numero dei figli di ogni nodo è fissato a 1, l albero in realtà descrive una lista concatenata Una lista concatenata è una struttura dati che in Java si usa raramente le sue funzionalità (aggiungere e togliere elementi dalla sequenza) sono simili a quelle di Vector, ArrayList e altre strutture dati presenti nella Libreria Standard Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 24 / 40

La struttura dati Albero (4) Quando il numero dei figli di ogni nodo può variare, in Java di solito i riferimenti ai figli si memorizzano tramite vettori Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 25 / 40

La struttura dati Albero (5) Esempio: I generi letterari dei libri di una biblioteca Ogni generi (es. prosa, poesia,...)... ha tanti sotto-generi ( es. romanzi, racconti,...)... che prevedono sotto-sotto-generi (es. romanzo storico, romanzo di avventura,...) public class GenereLetterario { private String nomegenere ; private Vector < GenereLetterario > sottogeneri ; //... costruttori e metodi Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 26 / 40

La struttura dati Grafo Generalizzando un po la definizione di albero, otteniamo un grafo Un grafo: E costituito da nodi (in Java sono oggetti) I nodi sono collegati da archi (in Java sono riferimenti, o oggetti aggiuntivi) Molti programmi richiedono l uso di grafi (es. gestione reti ferroviarie e stradali, social network, World Wide Web,...) Gli algoritmi che utilizzano grafi possono essere piuttosto complicati si va ben oltre gli scopi di questo corso... Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 27 / 40

La ricorsione (1) Un programma è detto ricorsivo quando risolve un problema di una certa dimensione riutilizzando se stesso su un problema di dimensione minore Nell esempio dell albero genealogico: il metodo che stampa l albero (di un individuo) riutilizza se stesso per stampare un sottoalbero (di un geniore dell individuo) L approccio ricorsivo si contrappone all approccio iterativo in cui i problemi sono risolti mediante cicli L approccio ricorsivo può essere molto efficace (consente di scrivere alcuni programmi in poche righe) ma: può essere difficile da imparare ad utilizzare propriamente se usato impropriamente può causare problemi (es. mancata terminazione del programma) Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 28 / 40

La ricorsione (2) Confrontiamo l approccio iterativo e l approccio ricorsivo. Esempio (classico): Il calcolo del fattoriale n! = n n 1... 2 1 // soluzione iterativa private int fattorialeiterativo ( int n) { int ris = 1; for ( int i =1; i <=n; i ++) ris *= i; return ris ; // soluzione ricorsiva private int fattorialericorsivo ( int n) { if ( n ==0) return 1; else return n* fattorialericorsivo (n -1); Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 29 / 40

La ricorsione (3) L approccio ricorsivo è abbastanza comune in matematica: definiamo la funzione matematica fattoriale(n) fattoriale(n) = { 1 se n = 0; n fattoriale(n 1) altrimenti Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 30 / 40

La ricorsione (4) Come tutte le chiamate di metodi, le chiamate ricorsive sono gestite tramite record di attivazione (rivedere lezioni precedenti) La chiamata ricorsiva: sospende il metodo in corso di esecuzione attiva il metodo chimamato (una nuova istanza dello stesso metodo) quando al termine del metodo chiamato il controllo ritorna al chiamante Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 31 / 40

La ricorsione (5) Esempio di metodo ricorsivo: public void esempioricorsione ( int i) { if (i ==0) System. out. println (" ECCO 0"); else { System. out. println (" PRIMA " + i); esempioricorsione (i -1); System. out. println (" DOPO " + i); Chiamando il metodo come segue: esempioricorsivo (3); Il risultato sarà: PRIMA 3 PRIMA 2 PRIMA 1 ECCO 0 DOPO 1 DOPO 2 DOPO 3 Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 32 / 40

La ricorsione (6) Un metodo ricorsivo deve prevedere un numero di casi a seconda della dimensione del problema da affrontare Dobbiamo avere: uno o più casi base che risolvono il problema senza bisogno di chiamate ricorsive uno o più casi ricorsivi che hanno bisogno di effettuare chiamate ricorsive per risolvere sottoproblemi private int fattorialericorsivo ( int n) { if ( n ==0) return 1; // caso base else return n* fattorialericorsivo (n -1); // caso ricorsivo Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 33 / 40

La ricorsione (7) La condizione necessaria affinchè la ricorsione possa funzionare è che le chiamate ricorsive prima o poi raggiungano un caso base altrimenti il programma non terminerebbe mai... eseguirebbe chiamate ricorsive all infinito Vediamo un esempio di programma ricorsivo mal posto. che succede se si invoca il metodo con parametro dispari? private int fattorialedifettoso ( int n) { if ( n ==0) return 1; // caso base else return n* fattorialericorsivo (n -2); // caso ricorsivo Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 34 / 40

La ricorsione (8) Rivediamo l esempio della stampa dell albero genealogico // nuovo metodo della classe Individuo public void stampaalberogenealogico ( int contatore ) { // stampa tanti trattini quanti indicati da contatore for ( int i =0; i< contatore ; i ++) System. out. println (" --"); System. out. println ( nome ); // chiamate ricorsive con contatore aumentato if ( padre!= null ) padre. stampaalberogenealogico ( contatore +1); if ( madre!= null ) madre. stampaalberogenealogico ( contatore +1); In questo esempio: Abbiamo ricorsione multipla (2 chiamate ricorsive) Il caso base lo si ha quando padre e madre sono entrambi null (si stampa solo il nome) Il sottoproblema non è identificato dal parametro del metodo, ma dall oggetto su cui il metodo è invocato quando è chiamato su bart, radice dell albero intero...... si richiama ricorsivamente su homer e marge, radici di sottoalberi Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 35 / 40

Esempio: la ricerca dicotomica (o binaria) (1) Vediamo un esempio complesso di programma ricorsivo: La ricerca dicotomica (o ricerca binaria) Supponiamo di avere un array ordinato contenente interi vogliamo sapere se un certo numero è contenuto nell array Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 36 / 40

Esempio: la ricerca dicotomica (o binaria) (2) Prima soluzione (iterativa) public class Ricerca { public static void main ( String [] args ) { // array ordinato di lunghezza 12 int [] a = { 2, 3, 6, 8, 9, 10, 14, 15, 21, 22, 24, 30, 41 ; boolean trovato = ricerca (a, 19); // restituisce false // restituisce true se x e presente in a private boolean ricerca ( int [] a, int x) { boolean trovato = false ; for ( int y : a) { if ( x==y) trovato = true ; return trovato ; Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 37 / 40

Esempio: la ricerca dicotomica (o binaria) (3) Ragioniamo un attimo: l algoritmo che abbiamo implementato va a guardare tutti i valori dell array se l array è grande, questo può richiedere tempo non abbiamo sfruttato il fatto che gli elementi sono ordinati Idea: come si cerca di solito una parola in un vocabolario? Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 38 / 40

Esempio: la ricerca dicotomica (o binaria) (4) Altra soluzione: leggiamo il valore centrale dell array e lo confrontiamo con il valore cercato il confronto ci dice se continuare la ricerca nella metà di destra o di sinistra dell array ripetiamo la ricerca ricorsivamente nella metà selezionata Quanti numeri dovremo leggere? Ad ogni passo ne buttiamo via la metà senza leggerli Alla fine avremo confrontato il numero cercato con un numero di valori dell array pari al logaritmo della dimensione (quindi molti meno) Nell esempio i numeri erano 12, ma bastano 3 confronti... Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 39 / 40

Esempio: la ricerca dicotomica (o binaria) (5) public class RicercaBinaria { public static void main ( String [] args ) { // array ordinato di lunghezza 12 int [] a = { 2, 3, 6, 8, 9, 10, 14, 15, 21, 22, 24, 30, 41 ; boolean trovato = ricercabinaria (a, 0, a. length, 19); // restituis // restituisce true se x e presente in a // sx e dx sono gli estremi destro e sinistro della porzione // di array che si considera public boolean ricercabinaria ( int [] a, int sx, int dx, int x) { boolean trovato ; if (sx <= dx) { int centro = ( sx+dx )/2; // calcola il centro if (x < a[ centro ]) return ricercabinaria (a, sx, centro -1, x); if (x > a[ centro ]) return ricercabinaria (a, centro +1, dx, x); if ( x == a[ centro ]) return true ; else return false ; Paolo Milazzo (Università di Pisa) Programmazione - Alberi A.A. 2013/2014 40 / 40