Java 使用递归进行循环

Java 使用递归进行循环,java,loops,for-loop,recursion,Java,Loops,For Loop,Recursion,如何使用递归编写一个java程序,该程序计算所有可能的组合,包括从0到3的任意3个数字,并将总和设为5。允许重复 答案应该像这样打印所有排列 3 + 2 + 0 3 + 1 + 1 3 + 0 + 2 2 + 2 + 1 2 + 1 + 2 2 + 0 + 3 1 + 3 + 1

如何使用递归编写一个java程序,该程序计算所有可能的组合,包括从0到3的任意3个数字,并将总和设为5。允许重复

答案应该像这样打印所有排列

              3 + 2 + 0
              3 + 1 + 1
              3 + 0 + 2
              2 + 2 + 1
              2 + 1 + 2
              2 + 0 + 3
              1 + 3 + 1
              1 + 2 + 2
              1 + 1 + 3
我试过写一个函数,但我认为它效率低下。有谁能告诉我,在没有这么多ifs的情况下,我如何优化它以获得更好的执行时间

public class Combinations 
{
    static int aux = 0;
    static int temp;
    static void findCombinations(int sum, int max,int min)
    {
        if(max <= 2)
        {
            if(max <= 0)
            {
                if(aux >= 3)
                {
                    System.out.println("max: "+max);
                    System.out.println("min: "+min);
                    System.out.println("Aux:"+aux);
                    System.out.println("-----------");
                    return;
                }
                else
                {
                    System.out.println("max: "+max);
                    System.out.println("min: "+min);
                    System.out.println("Aux:"+aux);
                    System.out.println("-----------");
                    aux = aux + 1;
                    min = min - 1;
                    findCombinations(sum, max, min);
                }
            }
            else
            {
                System.out.println("max: "+max);
                System.out.println("min: "+min);
                System.out.println("Aux:"+aux);
                System.out.println("-----------");
                aux = aux + 1;
                max = max - 1;
                findCombinations(sum, max, min);
            }
        }
        else
        {
            System.out.println("max: "+max);
            System.out.println("min: "+min);
            System.out.println("Aux:"+aux);
            System.out.println("-----------");
            max = max - 1;
            min = min + 1;      
            findCombinations(sum, max, min);
        }
    }
    //Driver code
    public static void main(String a[])
    {
        int n = 5;
        int max_bound = 3;
        int min_for_sum = n - max_bound; 
        findCombinations(n,max_bound,min_for_sum);
    }
}
下面给出了代码的输出

最高:3 最小:2 辅助:0 +++++++++ 最高:2 min:3 辅助:0 +++++++++++ 最高:1 min:3 辅助:1 ++++++++++ 最高:0 min:3 辅助:2 ++++++++++ 最高:0 最小:2
Aux:3

这是你的家庭作业,我只做了一个基本代码,我没有尝试编译它,这只是为了一般的指导,我也没有添加0,但你明白了:

public static void main(String []args){
    print(0, new int[3])
 }

 static void print(int num, int[] current){
     if(num == 3){
         if((current[0] + current[1] + current[2]) ==5) print (current);
         return;
     }
     int[] with1 = new int[3];
     int[] with2 = new int[3];
     int[] with3 = new int[3];
     with1[num] = 1;
     with2[num] = 2;
     with3[num] = 3;
     //copy the start of the current array to each new array here
     num++
     print(num,with1);
     print(num,with2);
     print(num,with3);

 }

我不确定这是否是一个推荐的方法,但你可以得到结果

公开课考试{ 公共静态字符串参数[]{

    int count = 0;
    for(int i=0; i<=3; i++){
        for(int j=0; j<=3; j++){
            for(int k=0; k<=3; k++){
                if((i+j+k) == 5){
                    System.out.println("i="+i+","+"j="+j+","+"k="+k);
                    count++;
                }
            }
        }
    } 
   System.out.println("count = "+count);       
}

}

从一个简单的解决方案开始,下面介绍如何将3个嵌套循环解决方案减少为2个嵌套循环

通过调用sumUp3进行测试; 输出:

[0,2,3]之和为5 [0,3,2]之和为5 [1,1,3]之和是5 [1,2,2]之和是5 [1,3,1]之和是5 [2,0,3]之和是5 [2,1,2]之和是5 [2,2,1]之和是5 [2,3,0]之和是5 [3,0,2]之和为5 [3,1,1]之和是5 [3,2,0]之和是5


您通常从编写一个类和添加一个main方法开始。您的具体问题是什么?公共静态void partitionint n,int max,String p{if n==0{System.out.printlnp;return;}for int i=Math.minmax,n;i>=1;i-{partitionn-i,i,p++i;} }如何编辑分区函数,使其仅包含3个数字。它将递归地进行除法,甚至包括1+1+1+1+1,这是不需要的@MarvinStack overflow不是免费的程序编写服务。请尝试编写您的程序,如果遇到问题,您可以来这里发布代码,说明您遇到的确切问题并寻求帮助。Assum这是编程课上的一个练习,你也可以向你的老师寻求帮助。像这样的三个嵌套for循环很少是做某事的推荐方法,而且可能是一个糟糕的解决方案。但是当你这样回答时,你应该展开:为什么它有效?你的思维过程是什么?对于可能来到这里的其他人,应该是generic,这样他们就可以很容易地根据自己的需要对其进行调整。此外,请确保文本和代码之间有一个额外的行,以便所有代码都按此格式进行格式化。第二个循环forint j=0;jI以一种非常低效的方式使用了递归。您能建议我可以进行哪些更改以使其有效吗。
private static void sumUp(int max) {

    sumUp(max, 0,0);
}

private static void sumUp(int maxValue, int k, int counter ) {

    for (int i = 0; i<= maxValue ; i++ ) {

        for (int j = 0; j<= maxValue ; j++ ) {

            if((i+j+k) ==5) {
                System.out.println(i+"+"+j+"+"+k+" = " +(i+j+k));
            }

            counter++;
        }
    }

    k++;
    if(k > maxValue) { return;  }

    sumUp( maxValue, k, counter);
}
static void sumUp (int max) {
        sumUp(new int[] {0,0,0}, max, 0);
    }

    static void sumUp (  int[] start, int max, int index ) {

        for(int i= start[index] ; i<= max; i += 1) {

            start[index] = i;

            if(index < (start.length-1)) {

                int keep = start[index+1];
                sumUp(start, max, index+1 );
                start[index+1] = keep;

            } else {
                if(IntStream.of(start).sum() == 5) {
                    System.out.println("Sum of "+Arrays.toString(start)+" is 5");
                }
            }
        }
    }