Esercizi e progetti di programmazione - Apogeo
Esercizi e progetti di programmazione - Apogeo
Esercizi e progetti di programmazione - Apogeo
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