別の質問では、中国人郵便配達問題の特定のセットを生成することを含む素晴らしい答えが提供されました。
提供された答えは次のとおりです。
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
これにより、次の目的の結果が出力されます。
[(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)]
これは、Pythonの表現力を実際に示しています。これは、アルゴリズムの擬似コードを作成する方法とほぼ同じだからです。私は特に、利回りの使い方と、セットが一級市民として扱われる方法が好きです。
しかし、そこに私の問題があります。
次の方法が最適です。
1.Javaでyieldreturn構文の機能を複製しますか?代わりに、リストを維持し、私の部分的な結果をこのリストに追加するのが最善でしょうか?歩留まりキーワードをどのように処理しますか。
2.セットの取り扱いは?Setインターフェイスを実装するJavaコレクションの1つを使用してから、removeAll()などを使用してセットの違いを得ることができると思います。その場合、これはあなたがすることですか?
最終的に、私はこのメソッドをJavaで可能な限り簡潔でわかりやすい方法に減らすことを目指しています。このメソッドのJavaバージョンのreturnタイプは、int配列のリストなどを返す可能性が高いと思います。
このメソッドをJavaに変換するとき、上記の状況をどのように処理しますか?