W another question otrzymałem wspaniałą odpowiedź, w tym generowanie pewnych zestawów dla problemu chińskiego listonosza.Jaki jest najlepszy sposób na przetłumaczenie tej metody python rekursywny na Java?
Odpowiedź warunkiem było:
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
ten wyświetli wynik pragnienie:
[(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)]
To naprawdę popisuje się wyrazistość Python bo to jest prawie dokładnie tak, jak chciałbym napisać pseudo -Kod dla algorytmu. Szczególnie podoba mi się wykorzystanie plonów i sposób, w jaki zestawy te są traktowane jako pierwszorzędni obywatele.
Jednak mój problem leży w kłamstwie.
Jaki byłby najlepszy sposób:
1.Duplicate funkcjonalność zamian plastyczności skonstruować w Java? Czy zamiast tego najlepiej będzie utrzymywać listę i dołączać moje częściowe wyniki do tej listy? Jak poradzisz sobie ze słowem kluczowym yield.
2.Zachowaj postępowanie z zestawami? Wiem, że prawdopodobnie mógłbym użyć jednej z kolekcji Java, która implementuje interfejs Set, a następnie używać rzeczy takich jak removeAll(), aby dać mi ustawioną różnicę. Czy to właśnie zrobiłbyś w tym przypadku?
Koniec końców, staram się zredukować tę metodę w sposób tak zwięzły i bezpośredni, jak to możliwe w Javie. Myślę, że zwracany typ wersji java tej metody prawdopodobnie zwróci listę tablic int lub coś podobnego.
Jak radziłbyś sobie z powyższymi sytuacjami podczas konwersji tej metody na Javę?
Niestety, Java nie ma niczego przypominającego "wydajność". Można go przybliżać za pomocą wątków i przekazywanie wiadomości, ale wynik byłby nieporęczny, niezwykle nieefektywny i prawdopodobnie nie w duchu zadania. –
@Marcelo: Co to ma wspólnego z wątkami? – doublep
Wątki? Jak wykorzystałbyś wątki do odtworzenia tego? – Beothorn