使用递归进行循环

时间:2018-03-24 17:40:09

标签: java loops for-loop recursion

如何使用递归来编写java程序,该递归计算涉及从0到3的任何3个数字的所有可能组合,并将sum表示为5.允许重复。

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

fwrite

我试过写一个函数,但我认为它效率低下。任何人都可以告诉我如何优化它以获得更好的执行时间并且没有那么多ifs

              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

代码的输出在下面给出

最大:3 分钟:2 AUX:0 +++++++++ 最大:2 分:3 AUX:0 +++++++++++ 最大值:1 分:3 辅助:1 ++++++++++ 最大值:0 分:3 AUX:2 ++++++++++ 最大值:0 分钟:2 AUX:3

3 个答案:

答案 0 :(得分:0)

从一个简单的解决方案开始,以下是如何将3个嵌套循环解决方案减少到2个嵌套循环。

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

通过调用sumUp(3);进行测试 为简单起见,此解决方案已发布,以使基本概念清晰。

当然可以进一步改进,只使用递归,没有循环 的修改 这是一个完整的解决方案,它使用一个循环的递归:

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

通过调用sumUp(3);进行测试
输出:

  

[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

答案 1 :(得分:-1)

这是你的作业,我只做了一个基本的代码(我没有尝试编译它,这只是为了大方向),我也没有添加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);

 }

答案 2 :(得分:-1)

我不确定这是否是推荐方式,但你可以得到结果。

public class Test {     public static void main(String args []){

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

}