31.05.2013 Views

Esercizi e progetti di programmazione - Apogeo

Esercizi e progetti di programmazione - Apogeo

Esercizi e progetti di programmazione - Apogeo

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

}<br />

public PermutationIterator(String s) {...}<br />

public String nextPermutation() {...}<br />

public boolean hasMorePermutations() {...}<br />

ESERCIZI E PROGETTI DI PROGRAMMAZIONE E–55<br />

Ecco come si usa tale classe per visualizzare tutte le permutazioni della stringa “eat”:<br />

PermutationIterator iter = new PermutationIterator(“eat”);<br />

while (iter.hasMorePermutations())<br />

{<br />

System.out.println(iter.nextPermutation());<br />

}<br />

Dobbiamo, quin<strong>di</strong>, identifi care un modo per calcolare ricorsivamente le permutazioni, restituendole<br />

però una per volta. Consideriamo la stringa “eat”. Come già visto, genereremo tutte le permutazioni<br />

che iniziano con la lettera ‘e’, poi quelle che iniziano con la lettera ‘a’ e, infi ne, quelle che<br />

iniziano con la lettera ‘t’. Come generiamo le permutazioni che iniziano con ‘e’? Costruiamo<br />

un altro esemplare <strong>di</strong> PermutationIterator (che chiamiamo tailIterator) che itera all’interno<br />

dell’insieme delle permutazioni della sottostringa “at”. Nel metodo nextPermutation, chie<strong>di</strong>amo<br />

semplicemente a tailIterator quale sia la sua successiva permutazione, alla quale aggiungiamo<br />

‘e’ come prima lettera. C’è, però, un caso speciale: quando tailIterator esaurisce le proprie<br />

permutazioni, signifi ca che sono già state elencate tutte le permutazioni che iniziano con la lettera<br />

che stiamo esaminando. Di conseguenza:<br />

• Facciamo avanzare la posizione che stiamo esaminando.<br />

• Calcoliamo la nuova stringa contenente tutte le lettere tranne quella in esame.<br />

• Creiamo un nuovo generatore iterativo <strong>di</strong> permutazioni per tale nuova stringa.<br />

Quando la posizione da esaminare giunge al termine della stringa, il lavoro è terminato.<br />

*** <strong>Esercizi</strong>o P12.12. La classe seguente genera tutte le permutazioni dei numeri 0, 1, 2, ..., n – 1,<br />

senza usare la ricorsione.<br />

public class NumberPermutationIterator<br />

{<br />

private int[] a;<br />

public NumberPermutationIterator(int n)<br />

{<br />

a = new int[n];<br />

for (int i = 0; i < n; i++) a[i] = i;<br />

}<br />

public int[] nextPermutation()<br />

{<br />

if (a.length 0; i––)<br />

{<br />

if (a[i – 1] < a[i])<br />

{<br />

int j = a.length – 1;<br />

while (a[i – 1] > a[j]) j––;<br />

swap(i – 1, j);<br />

reverse(i, a.length – 1);<br />

return a;<br />

}<br />

Cay Horstmann: Concetti <strong>di</strong> informatica e fondamenti <strong>di</strong> Java 5 a ed. - Copyright 2010 <strong>Apogeo</strong> srl

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!