如何在Java中编写递归方法,打印3个不同数字的组合,并使用可变数量的数字? (不应包括重复。)也就是说,该方法应适用于不同的组合长度。例如,使用组合中使用的数字0,1,2和两个数字,您应该具有:0 0 - 0 1 - 0 2 - 1 1 - 1 2 - 2 2.
使用相同的数字,3个数字的组合是: 0 0 0 - 0 0 1 - 0 0 2 - 0 1 1 - 0 1 2 - (...), 等等。 我在其他类似主题中检查了几种类型的递归方法,但我仍然无法彻底理解这一点并编写自己的方法。
答案 0 :(得分:0)
也许先尝试计算所有排列。然后继续计算组合。维基上的图像非常有启发性https://en.wikipedia.org/wiki/Combination
您也可以通过此代码尝试使用笔和纸:Combinations method return issue!
答案 1 :(得分:0)
基于对基于n的数字系统的数量进行计数,我提出了一种非递归解决方案。例如,对于具有基数3的系统,添加的数字是3的幂。
应该注意的是,这会打印所有组合,并且应该稍后删除具有重复元素的组合,这在我的情况下是需要的。例如,从组合001,010,100开始,只剩下第一个,其中元素按升序排列。
public static void main(String[] args) {
int t = 2;
int r = 2;
ArrayList<Integer> l = new ArrayList<Integer>();
int tmp;
for (int p = 0; p <= (int)(Math.pow((double)t, (double)r)) - 1; p++) {
tmp = p;
for (int q = r - 1; q >= 0; q--) {
for (int s = t - 1; s >= 0; s--) {
if (tmp >= s * (int) (Math.pow(t, q))) {
l.add(Integer.valueOf(s));
tmp = tmp - s * (int) (Math.pow(t, q));
break;
}
}
}
}
for (int i = 0; i <= l.size() - 1; i++) {
if (i % r != r - 1) {
System.out.print(l.get(i) + "-");
} else {
System.out.println(l.get(i));
}
}
}