如何获得固定数量的元素和可变数量的使用元素的组合(无重复)

时间:2016-01-29 09:39:45

标签: java

如何在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 - (...), 等等。 我在其他类似主题中检查了几种类型的递归方法,但我仍然无法彻底理解这一点并编写自己的方法。

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));
        }
    }
}