【问题标题】:java from for loop to recursion in finding combinationjava从for循环到递归寻找组合
【发布时间】:2011-10-01 20:46:59
【问题描述】:

如果 groupSize=3, n=6 将打印,我如何将此 for 循环更改为递归 123 124 125 126 134 135 136 145 146 156 234 235 236 245 246 345 346 356 456

public static void printCombinations(int groupSize, int n){

    if (groupSize <=n && groupSize>0 && n>0){

            for (int i=1; i<=n; i++){
                for (int j=1; j<=i-1; j++){
                    for (int k=1; k<=j-1; k++){
                        int first = k;
                        int second = j;
                        int third = i;
                        if (i!=j && i!=k && j!=k){
                            System.out.println(first +" " + second +" "+ third);
                            }
                    }
                }   
            }
        }
    }

【问题讨论】:

  • 1. n 不能小于零 groupSize 大于 0 且小于 n。 2.你的第二个for循环不会运行,因为i的第一个值为1,所以当j为1时,它将大于1-1,即0。
  • 你能发布你到目前为止所尝试的吗?
  • @Walkerneo:对我来说似乎是合理使用递归。
  • @MarkByers,是的,我一开始还以为他在做别的事情
  • 好的,所以您尝试使用数字 1 到 n 打印所有具有 groupSize 中位数的数字,以使百位中的数字小于十位中的数字小于个位数?

标签: java loops recursion for-loop


【解决方案1】:

边缘可能会很粗糙;我只是在学习 Java。

class comboMaker {
    public static void main(String args[]){
        String[] test1 = startCombo(3,6);
        prnt(test1);
    }
    private static String[] startCombo(int len,int digits){
        return combos(len,digits,"",0);
    }
    private static String[] combos(int len,int digits,String cur,int lastdig){
        if (len>digits){
            return null;
        }
        if (cur.length()==len){
            return new String[]{cur};           
        }
        String tmp = cur;
        String[] rtn = {};
        for(int i = lastdig+1;i<=digits;i++){
            tmp=cur+Integer.toString(i);
            rtn=concat(rtn,combos(len,digits,tmp,i));   
        }
        return rtn;

    }
    private static String[] concat(String[] A, String[] B) {
           String[] C= new String[A.length+B.length];
           System.arraycopy(A, 0, C, 0, A.length);
           System.arraycopy(B, 0, C, A.length, B.length);
           return C;
    }

    private static void prnt(String[] str){
        if(str==null){
            System.out.println("Invalid string array");
            return;
        }
        for(int i =0;i<str.length;i++ ){
            System.out.println(str[i]);
        }   
    }   
}

我包含了一种连接数组的方法,我在这里找到了:How can I concatenate two arrays in Java?

也是一种打印组合生成器生成的字符串数组的方法。

【讨论】:

  • 考虑到这可能是家庭作业,最好不要给出如此完整/明确的答案。
  • 也许不是功课。也许这会对他有所帮助,否则他会在课堂上不及格。老实说,我不知道,但我正在尝试学习 Python 和 Java,所以我只是想要经验。
  • 谢谢大家给出的例子,我正在学习java,这将要学习递归,如果我将groupSize更改为4,上面的代码写得不好,不起作用。因此,我打算以递归方式编写它。 =)
  • 使用 comboStart(4,6) 时输出:1234 1235 1236 1245 1246 1256 1345 1346 1356 1456 2345 2346 2356 2456 3456 生成的数字长度不能超过给定的位数,否则每个值的位数不足大于上一个。
  • user963501:如果你觉得这个答案有帮助,你应该给 @Walkerneo 信用
【解决方案2】:

创建一个方法,该方法将生成带有 x 位的特定值的后缀,并返回所有可能后缀的列表。可能是这样的:

List<String> generateSuffixes(int prefix, int suffixSize, int maxDigitValue);

该方法将从prefix + 1 迭代到maxDigitValue。然后它会用迭代值和suffixSize - 1 调用自己。它将迭代附加到生成的每个后缀以创建要返回的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多