如果我理解正确,这个问题的递归解决方案应该相当简单:
>从集合中删除第一个元素A.
>对于每个剩余的元素B:
>从集合中删除元素B.
>创建一对(A,B)并将其存储为当前解决方案的一部分
>使用剩余的集进行递归.这将为当前解决方案添加更多对.如果集合中没有剩余元素,则将当前解决方案存储为最终解决方案之一.
>将元素B添加到集合中
>将元素A添加到集合中
添加和删除元素的部分实际上并不包含在此示例实现中,因为它为迭代和递归调用创建了一个列表和一个新集合,但这个想法应该是清楚的.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class AllPairs
{
public static void main(String[] args)
{
Set set = new LinkedHashSet(
Arrays.asList(1,2,3,4,5,6));
ArrayList>> results =
new ArrayList>>();
compute(set, new ArrayList>(), results);
for (List> result : results)
{
System.out.println(result);
}
}
private static void compute(Set set,
List> currentResults,
List>> results)
{
if (set.size() < 2)
{
results.add(new ArrayList>(currentResults));
return;
}
List list = new ArrayList(set);
Integer first = list.remove(0);
for (int i=0; i
{
Integer second = list.get(i);
Set nextSet = new LinkedHashSet(list);
nextSet.remove(second);
List pair = Arrays.asList(first, second);
currentResults.add(pair);
compute(nextSet, currentResults, results);
currentResults.remove(pair);
}
}
}