In another question Mi è stata fornita una grande risposta che comporta la generazione di determinati set per il Problema postino cinese.Qual è il modo migliore per tradurre questo metodo Python ricorsivo in Java?
La risposta fornita è stata:
def get_pairs(s):
if not s: yield []
else:
i = min(s)
for j in s - set([i]):
for r in get_pairs(s - set([i, j])):
yield [(i, j)] + r
for x in get_pairs(set([1,2,3,4,5,6])):
print x
Questa volontà di uscita il risultato desiderio:
[(1, 2), (3, 4), (5, 6)]
[(1, 2), (3, 5), (4, 6)]
[(1, 2), (3, 6), (4, 5)]
[(1, 3), (2, 4), (5, 6)]
[(1, 3), (2, 5), (4, 6)]
[(1, 3), (2, 6), (4, 5)]
[(1, 4), (2, 3), (5, 6)]
[(1, 4), (2, 5), (3, 6)]
[(1, 4), (2, 6), (3, 5)]
[(1, 5), (2, 3), (4, 6)]
[(1, 5), (2, 4), (3, 6)]
[(1, 5), (2, 6), (3, 4)]
[(1, 6), (2, 3), (4, 5)]
[(1, 6), (2, 4), (3, 5)]
[(1, 6), (2, 5), (3, 4)]
questa mostra davvero fuori l'espressività di Python, perché questo è quasi esattamente come vorrei scrivere la pseudo codice per l'algoritmo. Mi piace soprattutto l'utilizzo della resa e il modo in cui i set vengono trattati come cittadini di prima classe.
Tuttavia, nel mio caso, il mio problema.
Quale sarebbe il modo migliore per:
1.Duplicate la funzionalità del ritorno resa costruire in Java? Sarebbe preferibile invece mantenere una lista e aggiungere i risultati parziali a questa lista? Come gestiresti la parola chiave yield.
2. Gestire la gestione dei set? So che probabilmente potrei usare una delle collezioni Java che implementa l'implementazione dell'interfaccia Set e quindi usare cose come removeAll() per darmi una differenza di set. È questo che vorresti fare in quel caso?
In definitiva, sto cercando di ridurre questo metodo in modo più conciso e diretto possibile in Java. Sto pensando che il tipo restituito della versione java di questo metodo probabilmente restituirà una lista di array int o qualcosa di simile.
Come gestireste le situazioni precedenti quando convertite questo metodo in Java?
Sfortunatamente, Java non ha nulla che assomigli a 'yield'. Si potrebbe approssimarlo con discussioni e passaggi di messaggi, ma il risultato sarebbe sconcertante, estremamente inefficiente e probabilmente non nello spirito del compito in questione. –
@Marcelo: Che cosa ha a che fare con i thread? – doublep
Discussioni? Come useresti i thread per riprodurre questo? – Beothorn