En another question recibí una gran respuesta que implicaba la generación de ciertos conjuntos para el problema del cartero chino.¿Cuál es la mejor manera de traducir este método recursivo de python a Java?
La respuesta siempre era:
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
Esta es la salida el resultado deseo de:
[(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)]
Esto realmente muestra la expresividad de Python, porque esto es casi exactamente cómo iba a escribir el seudo -code para el algoritmo. Me gusta especialmente el uso del rendimiento y la forma en que los conjuntos se tratan como ciudadanos de primera clase.
Sin embargo, ahí radica mi problema.
¿Cuál sería la mejor manera:
1.Duplicate la funcionalidad del yield return construir en Java? ¿Sería mejor mantener una lista y anexar mis resultados parciales a esta lista? ¿Cómo manejarías la palabra clave yield?
2. ¿Manejar el manejo de los juegos? Sé que probablemente podría usar una de las colecciones de Java que implemente que implementa la interfaz Set y luego usar cosas como removeAll() para darme una diferencia establecida. ¿Es esto lo que harías en ese caso?
En última instancia, estoy tratando de reducir este método de la manera más concisa y directa posible en Java. Estoy pensando que el tipo de devolución de la versión java de este método probablemente devuelva una lista de matrices en int o algo similar.
¿Cómo manejarías las situaciones anteriores al convertir este método en Java?
Desafortunadamente, Java no tiene nada que se asemeje a 'rendimiento'. Podría aproximarlo con hilos y mensajes, pero el resultado sería engorroso, extremadamente ineficiente y probablemente no en el espíritu de la tarea en cuestión. –
@Marcelo: ¿Qué tiene que ver con los hilos? – doublep
¿Hilos? ¿Cómo usarías los hilos para reproducir esto? – Beothorn