将这个递归python方法转换为Java的最佳方法是什么?

8 python java yield set

另一个问题中,我得到了一个很好的答案,涉及为中国邮递员问题生成某些集合.

答案是:

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
Run Code Online (Sandbox Code Playgroud)

这将输出以下的期望结果:

[(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)]  
Run Code Online (Sandbox Code Playgroud)

这真的展示了Python的表现力,因为这几乎就是我为算法编写伪代码的方式.我特别喜欢收益率的使用以及集合被视为一等公民的方式.

然而,存在我的问题.

什么是最好的方式:

1.在Java中复用yield return构造的功能吗?最好是维护一个列表并将我的部分结果附加到此列表中吗?你将如何处理yield关键字.

处理套装处理?我知道我可以使用其中一个实现Set接口的Java集合,然后使用removeAll()之类的东西来给我一个区别.这是你在那种情况下会做的吗?

最终,我希望在Java中尽可能简洁直接地将此方法简化.我认为这个方法的java版本的返回类型可能会返回一个int数组列表或类似的东西.

将此方法转换为Java时,您将如何处理上述情况?

pan*_*nzi 2

为了将生成器函数转换为 Java,您必须将其重新实现为 Iterable+Iterator。例如:

def foo(x):
   for i in xrange(10):
      yield x * i
...
for x in foo(5):
   print(x)
Run Code Online (Sandbox Code Playgroud)

变成(警告:代码未经测试):

import java.util.Iterator;
import java.util.Iterable;

class Foo implements Iterable<Integer> {
   public final int x;

   public Foo(int x) {
      this.x = x;
   }

   public Iterator<Integer> iterate() {
      return new Iterator<Integer> {
         int i = 0;

         public boolean hasNext() {
            return i < 10;
         }

         public Integer next() {
            return x * (i ++);
         }
      };
   }
}
...
for (int x : new Foo(5)) {
   System.out.println(x);
}
Run Code Online (Sandbox Code Playgroud)

对于我确实会使用的集合java.util.HashSet