1 Un esempio con iteratore: le liste ordinate di interi.

Slides:



Advertisements
Presentazioni simili
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Advertisements

Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Esercizi su alberi binari
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Esercizi su alberi binari
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Esercizi Liste.
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Astrazione procedurale ed eccezioni
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Polimorfismo Significato Significato Varie famiglie Varie famiglie Polimorfismo in java Polimorfismo in java Polimorfismo di Sottotipo: Apparato in Java.
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 non vogliamo definire versioni differenti dell’astrazione corrispondente ad una collezione di elementi.
Astrazione di dati Esercizio 1. Si completi l’implementazione Poly.add data a lezione con la specifica e l’implementazione degli ausiliari min e max data.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Liste di Interi Esercitazione. IntList Lista di interi Problema tipico: memorizzare una sequenza di valori [6,0,9,3….9] Vediamo un tipo di dato utile.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Liste di Interi Esercitazione. IntList Lista di interi Una lista è una disposizione ordinata di elementi ( non in modo crescente-descrescente, ma per.
Si dia la specifica del tipo di dato astratto Tabella.Una Tabella ha due colonne e un numero variabile di righe. Gli elementi della prima colonna sono.
1 Gerarchie e polimorfismo: liste. 2 Generalizzare le liste di interi  List 4 lista di oggetti –non modificabile 4 vorremo poi definire un sottotipo.
Esercitazione Object, Vettori, Liste. Ereditarieta’ Abbiamo visto come tramite l’ereditarieta’ e’ possibile estendere classi esistenti -arricchendo lo.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
LIP: 9 Maggio Esercizi Riprendiamo un esercizio proposto Definire un tipo di dato Persona che definisce oggetti che rappresentano le informazioni.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 31 Marzo 2004). Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare.
1 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.
Esercizio 3. Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare i commenti.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
Primo Compitino Terzo Esercizio Implementare il tipo di dato astratto Table un oggetto di tipo Table ha due colonne e un numero variabile di righe.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
Esercizi iteratori. Matrice import java.util.Iterator; public class MatrixIterator implements Iterator { private Matrix matrix; private int currentRow.
1 Astrazioni polimorfe. 2 Perché il polimorfismo 4 Abbiamo visto come si definiscono insiemi di stringhe, insiemi di interi, insiemi di caratteri, etc.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 18 Aprile 2008 Interfacce. Rappresentazione Lista val next vuota Lista vuota: any true Lista non vuota: any true 154 false 24 false.
Ex.1 - Astrazioni su Dati Si abbia il tipo di dato stack di interi, IntStack, specificato sotto: public class IntStack { \\ OVERVIEW: uno Stack è una collezione.
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

1 Un esempio con iteratore: le liste ordinate di interi

2 Un nuovo esempio completo: le liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile –essenziale la presenza di un iteratore altrimenti sarebbe complesso accedere gli elementi

3 Specifica di OrderedIntList 1 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j // costruttore public OrderedIntList () // EFFECTS: inizializza this alla lista vuota // metodi public void addEl (int el) throws DuplicateException // MODIFIES: this // EFFECTS: aggiunge el a this, se el non occorre in // this, altrimenti solleva DuplicateException public void remEl (int el) throws NotFoundException // MODIFIES: this // EFFECTS: toglie el da this, se el occorre in // this, altrimenti solleva NotFoundException

4 Specifica di OrderedIntList 2 public boolean isIn (int el) // EFFECTS: se el appartiene a this ritorna // true, altrimenti false public boolean isEmpty () // EFFECTS: se this è vuoto ritorna true, altrimenti // false public int least () throws EmptyException // EFFECTS: se this è vuoto solleva EmptyException // altrimenti ritorna l’elemento minimo in this public Iterator smallToBig () // EFFECTS: ritorna un generatore che produrrà gli // elementi di this (come Integers), in ordine // crescente // REQUIRES: this non deve essere modificato finché // il generatore è in uso public boolean repOk () public String toString () }

5 Specifica di OrderedIntList 3 public class OrderedIntList { public OrderedIntList () public void addEl (int el) throws DuplicateException public void remEl (int el) throws NotFoundException public boolean isIn (int el) public boolean isEmpty () public int least () throws EmptyException public Iterator smallToBig () public boolean repOk () public String toString ()} 4 senza l’iteratore, non ci sarebbe nessuna operazione per accedere gli elementi  DuplicateException e NotFoundException checked

6 Implementazione di OrderedIntList 1 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; 4 la rep contiene –una variabile boolean che ci dice se la lista è vuota –la variabile intera che contiene l’eventuale valore dell’elemento –due (puntatori a) OrderedIntList s che contengono la lista di quelli minori e quelli maggiori, rispettivamente 4 implementazione ricorsiva 4 lista doppia –si può percorrere da ogni elemento in avanti o all’indietro

7 Implementazione di OrderedIntList 2 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; // la funzione di astrazione (ricorsiva!) //  (c) = se c.vuota allora [], altrimenti //  (c.prima) + [c.val] +  (c.dopo) // l’invariante di rappresentazione (ricorsivo!) // I (c) = c.vuota oppure // (c.prima != null e c.dopo != null e // I (c.prima) e I (c.dopo) e // (!c.prima.isEmpty() -> c.prima.max() < c.val) e // (!c.dopo.isEmpty() -> c.dopo.least() >= c.val) ) 4 l’invariante utilizza metodi esistenti – isEmpty e least  + max

8 Implementazione di OrderedIntList 3 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; // costruttore public OrderedIntList () // EFFECTS: inizializza this alla lista vuota { vuota = true; }  il costruttore inizializza solo la variabile vuota

9 Implementazione di OrderedIntList 3.1 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; //  (c) = se c.vuota allora [], altrimenti //  (c.prima) + [c.val] +  (c.dopo) // I (c) = c.vuota oppure // (c.prima != null e c.dopo != null e // I (c.prima) e I (c.dopo) e // (!c.prima.isEmpty() -> c.prima.max() < c.val) e // (!c.dopo.isEmpty() -> c.dopo.least() >= c.val) ) public OrderedIntList () // EFFECTS: inizializza this alla lista vuota { vuota = true; } 4 l’implementazione del costruttore –soddisfa l’invariante ( c.vuota = true ) –verifica la propria specifica (  (c) = [] )

10 Implementazione di OrderedIntList 4 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; public void addEl (int el) throws DuplicateException // MODIFIES: this // EFFECTS: aggiunge el a this, se el non occorre in // this, altrimenti solleva DuplicateException {if (vuota) { prima = new OrderedIntList(); dopo = new OrderedIntList(); val = el; vuota = false; return; } if (el == val) throw new DuplicateException(“OrderedIntList.addEl”); if (el < val) prima.addEl(el); else dopo.addEl(el); } 4 propaga automaticamente l’eventuale eccezione sollevata dalle chiamate ricorsive

11 Implementazione di OrderedIntList 4.1 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; // I (c) = c.vuota oppure // (c.prima != null e c.dopo != null e // I (c.prima) e I (c.dopo) e // (!c.prima.isEmpty() -> c.prima.max() < c.val) e // (!c.dopo.isEmpty() -> c.dopo.least() >= c.val) ) public void addEl (int el) throws DuplicateException {if (vuota) { prima = new OrderedIntList(); dopo = new OrderedIntList(); val = el; vuota = false; return; }... prima != null e dopo != null (calcolati dal costruttore) I (prima) e I (dopo) (calcolati dal costruttore) le implicazioni sono vere perché la premessa è falsa

12 Implementazione di OrderedIntList 4.2 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; // I (c) = c.vuota oppure // (c.prima != null e c.dopo != null e // I (c.prima) e I (c.dopo) e // (!c.prima.isEmpty() -> c.prima.max() < c.val) e // (!c.dopo.isEmpty() -> c.dopo.least() >= c.val) ) public void addEl (int el) throws DuplicateException... if (el < val) prima.addEl(el); else dopo.addEl(el); } 4 this non è vuoto prima != null e dopo != null I (prima) e I (dopo) (calcolati da una chiamata ricorsiva)  ramo then: il nuovo massimo di prima è (induttivamente) minore di val  ramo else: il nuovo minimo di dopo è (induttivamente) maggiore di val

13 Implementazione di OrderedIntList 4.3 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; //  (c) = se c.vuota allora [], altrimenti //  (c.prima) + [c.val] +  (c.dopo) public void addEl (int el) throws DuplicateException // MODIFIES: this // EFFECTS: aggiunge el a this, se el non occorre in // this, altrimenti solleva DuplicateException {if (vuota) { prima = new OrderedIntList(); dopo = new OrderedIntList(); val = el; vuota = false; return; }...   (c pre ) = []   (c.prima) = []   (c.dopo) = []   c.val] = [el]   (c) = [el]

14 Implementazione di OrderedIntList 4.4 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; //  (c) = se c.vuota allora [], altrimenti //  (c.prima) + [c.val] +  (c.dopo) public void addEl (int el) throws DuplicateException // MODIFIES: this // EFFECTS: aggiunge el a this, se el non occorre in // this, altrimenti solleva DuplicateException... if (el == val) throw new DuplicateException(“OrderedIntList.addEl”); 4 se ci sono elementi duplicati solleva l’eccezione, eventualmente propagando eccezioni sollevate dalle chiamate ricorsive (vedi dopo)

15 Implementazione di OrderedIntList 4.5 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; //  (c) = se c.vuota allora [], altrimenti //  (c.prima) + [c.val] +  (c.dopo) public void addEl (int el) throws DuplicateException // MODIFIES: this // EFFECTS: aggiunge el a this, se el non occorre in // this, altrimenti solleva DuplicateException... if (el < val) prima.addEl(el); else dopo.addEl(el); } 4  (c pre ) =  (c.prima pre ) + [c.val] +  (c.dopo pre )  se el < val la chiamata ricorsiva solleva l’eccezione oppure produce   (c.prima) = aggiunge el a prima pre 4  (c.dopo) =  (c.dopo pre ) 4  (c) = aggiunge el a c pre

16 Come è fatta una OrderedIntList 4 vediamo la lista prodotta dalla sequenza di comandi OrderedIntList ls = new OrderedIntList(); ls.addEl(12); ls.addEl(5); ls.addEl(17); ls.addEl(4);ls.addEl(8); ls.addEl(19); 12F F 4 F FF T TF T T T T T

Implementazione di OrderedIntList 5 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; public void remEl (int el) throws NotFoundException // MODIFIES: this // EFFECTS: toglie el da this, se el occorre in // this, altrimenti solleva NotFoundException {if (vuota) throw new NotFoundException(“OrderedIntList.remEl”); if (el == val) try { val = dopo.least(); dopo.remEl(val); } catch (EmptyException e) { vuota = prima.vuota; val = prima.val; dopo = prima.dopo; prima = prima.prima; return;} else if (el < val) prima.remEl(el); else dopo.remEl(el); }

18 Implementazione di OrderedIntList 6 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; public boolean isIn (int el) // EFFECTS: se el appartiene a this ritorna // true, altrimenti false {if (vuota) return false; if (el == val) return true; if (el < val) return prima.isIn(el); else return dopo.isIn(el); } public boolean isEmpty () // EFFECTS: se this è vuoto ritorna true, altrimenti false {return vuota; }

19 Implementazione di OrderedIntList 6.1 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; //  (c) = se c.vuota allora [], altrimenti //  (c.prima) + [c.val] +  (c.dopo) public boolean isIn (int el) // EFFECTS: se el appartiene a this ritorna // true, altrimenti false {if (vuota) return false; if (el == val) return true; if (el < val) return prima.isIn(el); else return dopo.isIn(el); } public boolean isEmpty () // EFFECTS: se this è vuoto ritorna true, altrimenti false {return vuota; } 4 dimostrazioni di correttezza ovvie

20 Implementazione di OrderedIntList 7 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; public int least () throws EmptyException // EFFECTS: se this è vuoto solleva EmptyException // altrimenti ritorna l’elemento minimo in this {if (vuota) throw new EmptyException(“OrderedIntList.least”); try { return prima.least(); } catch (EmptyException e) {return val;} }

21 Implementazione di OrderedIntList 7.1 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; //  (c) = se c.vuota allora [], altrimenti //  (c.prima) + [c.val] +  (c.dopo) public int least () throws EmptyException // EFFECTS: se this è vuoto solleva EmptyException // altrimenti ritorna l’elemento minimo in this {if (vuota) throw new EmptyException(“OrderedIntList.least”); try { return prima.least(); } catch (EmptyException e) {return val;} }  dimostrazione di correttezza ovvia

22 Implementazione di OrderedIntList 8 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; public Iterator smallToBig () // EFFECTS: ritorna un generatore che produrrà gli // elementi di this (come Integers), in ordine // crescente // REQUIRES: this non deve essere modificato finché // il generatore è in uso {return new OLGen(this, count());} private int count () { if (vuota) return 0; return 1 + prima.count() + dopo.count(); } 4 al generatore viene passato il numero di elementi della lista – calcolato dal metodo privato count

23 Implementazione del generatore di OrderedIntList 1 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo // la funzione di astrazione (ricorsiva!) //  (c) = se c.cnt = 0 allora [], altrimenti // se il numero di elementi di  (c.figlio) è c.cnt // allora  (c.figlio), // altrimenti  (c.figlio) + [Integer(c.me.val)] + //  (OLGen(c.dopo))

24 Implementazione del generatore di OrderedIntList 2 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo // l’invariante di rappresentazione // I (c) = c.cnt = 0 oppure // (c.cnt > 0 e c.me != null e c.figlio != null e // (c.cnt = c.figlio.cnt + 1 oppure // c.cnt = c.figlio.cnt + c.me.dopo.count() + 1))

25 Implementazione del generatore di OrderedIntList 3 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo OLGen (OrderedIntList o, int n) { // REQUIRES: o != null cnt = n; if (cnt > 0) { me = o; figlio = new OLGen(o.prima, o.prima.count()); } 4 anche il costruttore è ricorsivo

26 Implementazione del generatore di OrderedIntList 3.1 public class OrderedIntList { private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo // I (c) = c.cnt = 0 oppure // (c.cnt > 0 e c.me != null e c.figlio != null e // (c.cnt = c.figlio.cnt + 1 oppure // c.cnt = c.figlio.cnt + c.me.dopo.count() + 1)) OLGen (OrderedIntList o, int n) { // REQUIRES: o != null cnt = n; if (cnt > 0) { me = o; figlio = new OLGen(o.prima, o.prima.count()); } 4 cnt = 0 oppure 4 cnt > 0 e me != null (clausola REQUIRES) e 4 figlio != null (chiamata ricorsiva) e 4 disgiunzione sui count (proprietà di count)

27 Implementazione del generatore di OrderedIntList 4 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo public boolean hasNext () { return cnt > 0; }  si noti l’uso di cnt per rendere efficiente anche questo metodo

28 Implementazione del generatore di OrderedIntList 5 public class OrderedIntList { // OVERVIEW: una OrderedIntList è una lista // modificabile di interi ordinata // tipico elemento: [x1,..., xn], xi<xj se i<j private boolean vuota; private OrderedIntList prima, dopo; private int val; private static class OLGen implements Iterator { private int cnt; // numero di elementi ancora da generare private OLGen figlio; // sottogeneratore corrente private OrderedIntList me; // il mio nodo public Object next () throws NoSuchElementException { if (cnt == 0) throw new NoSuchElementException(“OrderedIntList.smallToBig”) ; cnt --; try { return figlio.next(); } catch (NoSuchElementException e) {} // se arriva qui ha finito tutti quelli prima figlio = new OLGen(me.dopo, cnt); return new Integer(me.val); }