给定的是具有一些元素的集合M
,例如M={a, b}
和另一组F
,其中的特定数字代表M
排列中的数量。例如F={3, 1}
,因此对于此示例,排列为:P={(a, a, a, b), (a, a, b, a), (a, b, a, a), (b, a, a, a)}
。
我想打印那些但是在摆弄了递归之后我仍然无法让它发挥作用。 我目前的代码如下:
void printPermutations(Map<Integer, String> m, List<Integer> f, List<Integer> cf, int size, int depth, int index, int innerindex, List<String> toPrint)
{
if(depth == size)
{
System.out.println("");
for(String a : toPrint)
System.out.print(a + " ");
System.out.println("");
}
else
{
for(int i = index + 1; i < m.size(); ++i)
{
if(f.get(innerindex).compareTo(Integer.valueOf(1)) < 0)
++innerindex;
toPrint.add(m.get(innerindex));
f.set(innerindex, f.get(innerindex) - Integer.valueOf(1));
printPermutations(m, f, f, size, depth + 1, i, innerindex, toPrint);
f.set(innerindex, f.get(innerindex) + Integer.valueOf(1));
toPrint.remove(m.get(innerindex));
if(f.get(innerindex).compareTo(cf.get(innerindex)) == 0 && innerindex > 0)
--innerindex;
}
}
}
//call
//asume some cool elements in f and mAsSet
// f.size() == mAsSet.size()
List<String> toPrint = new ArrayList<String>();
Map<Integer, String> m = new HashMap<Integer, String>(mAsSet.size());
int counter = 0;
for(String a : m)
m.put(Integer.valueOf(counter++), a);
int size = 0;
for(Integer i : f)
size += i;
printPermutations(m, f, f, size, 0, -1, 0, toPrint);
我真的没有看到这里的错误,它什么都没打印。当然我调试了这个,但我真的没有任何其他的想法来实现我想要的东西。
答案 0 :(得分:1)
看看big boys are handling permutations是怎样的。如果您正在处理的代码可以包含第三方库而不是guava。这将导致类似:
final ImmutableList<String> m = ImmutableList.of("a", "b");
final ImmutableList<Integer> f = ImmutableList.of(3, 1);
final ImmutableList<String> values = FluentIterable.from(m).
transformAndConcat(new Function<String, Iterable<String>>() {
int c = 0;
public Iterable<String> apply(String input) {
return Collections.nCopies(f.get(c++), input);
}
}).toList();
final ImmutableSet<List<String>> permutations = ImmutableSet.copyOf(Collections2.permutations(values));
System.out.println(Joiner.on("\n").join(permutations));
Collections2.permutations将生成重复输出(即[a,a,a,b]将多次出现,但由于排列是作为Iterator实现的,因此不使用额外的内存,因为生成的ImmutableSet仅包含单个值。迭代运行值!(阶乘)时间。