In another question wurde mir eine große Antwort zur Verfügung gestellt, die bestimmte Sätze für das chinesische Postman-Problem erzeugt.Was ist der beste Weg, um diese rekursive Python-Methode in Java zu übersetzen?
Die Antwort zur Verfügung gestellt wurde:
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
Dies wird Ausgang des Wunsch Ergebnis:
[(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)]
Dies zeigt wirklich die Ausdruckskraft Python ab, weil dies fast genau ist, wie ich die Pseudo schreiben würde -code für den Algorithmus Ich mag besonders die Verwendung von Rendite und die Art und Weise, wie Sets als erstklassige Bürger behandelt werden.
Allerdings liegt da mein Problem.
1.Duplicate die Funktionalität der yield return-Konstrukt in Java: zu
Was wäre der beste Weg? Wäre es stattdessen besser, eine Liste zu führen und meine Teilergebnisse an diese Liste anzuhängen? Wie würden Sie mit dem Keyword Yield umgehen?
2.Handle den Umgang mit den Sätzen? Ich weiß, dass ich wahrscheinlich eine der Java-Sammlungen verwenden könnte, die implementiert, die die Set-Schnittstelle implementiert und dann Dinge wie removeAll() verwendet, um mir einen Set-Unterschied zu geben. Würden Sie das in diesem Fall tun?
Letztendlich versuche ich, diese Methode in Java so übersichtlich wie möglich zu machen. Ich denke, der Rückgabetyp der Java-Version dieser Methode wird wahrscheinlich eine Liste von int-Arrays oder etwas ähnliches zurückgeben.
Wie würden Sie mit den obigen Situationen umgehen, wenn Sie diese Methode in Java konvertieren?
Leider hat Java nichts, was "Ausbeute" bedeutet. Man könnte es mit Threads und Message-Passing annähern, aber das Ergebnis wäre sperrig, extrem ineffizient und wahrscheinlich nicht im Sinne der vorliegenden Aufgabe. –
@Marcelo: Was hat es überhaupt mit Threads zu tun? – doublep
Themen? Wie würdest du Threads verwenden, um das zu reproduzieren? – Beothorn