Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归地找到三个数字的组合,它们的总和等于给定的数字_Java_Recursion - Fatal编程技术网

Java 递归地找到三个数字的组合,它们的总和等于给定的数字

Java 递归地找到三个数字的组合,它们的总和等于给定的数字,java,recursion,Java,Recursion,给定一个介于1和30之间的数字,找到所有三个数字组合,并返回组合的数量,而不使用循环。 例如,给定5,打印 1 + 1 + 3 1 + 2 + 2 1 + 3 + 1 2 + 1 + 2 2 + 2 + 1 3 + 1 + 1 这就是我现在所拥有的,使用Java private static int numbers(int num, int num1, int num2, int num3){ boolean valid_solution = num1+num2+num3 =

给定一个介于1和30之间的数字,找到所有三个数字组合,并返回组合的数量,而不使用循环。 例如,给定5,打印

1 + 1 + 3 
1 + 2 + 2 
1 + 3 + 1 
2 + 1 + 2 
2 + 2 + 1 
3 + 1 + 1
这就是我现在所拥有的,使用Java

private static int numbers(int num, int num1, int num2, int num3){
    boolean valid_solution = num1+num2+num3 == num;
    int counter = 0;
    if (valid_solution){
      System.out.println(num1+" + "+num2+" + "+num3);
      counter++;
    }
    if (num1>10 || num2>10 || num3>10 || num1+num2+num3>num){
      return counter;
    }
    counter += numbers(num, num1 + 1, num2, num3)+numbers(num, num1, num2 + 1, num3)+numbers(num, num1, num2, num3 + 1);
    return counter;
  }

  public static int solutions(int num){
    if (num < 0 || num > 30) return 0;
    return numbers(num, 1, 1, 1);
  }

编辑-我也不允许使用全局变量。

我怀疑我的这段代码远不是一个好的解决方案,但谁知道呢,它可能会在某些方面对您有所帮助

public class FindSumCombinations {

static int start = 5;
static int comb1 = 0;
static int comb2 = 0;

public static void main(String[] args) {
    comb1(start);
}
public static int comb1(int x){
    if(x == 0) return 0;
    comb1 = x;
    comb2(x);
    return comb1(x-1);
}

public static int comb2(int x){
    if(x == 0) return 0;
    comb2 = x;
    comb3(x);
    return comb2(x-1);
}

public static int comb3(int x){
    if(x == 0) return 0;
    if(x + comb2 + comb1 == start){
        System.out.println(comb1 + "+" + comb2 + "+" + x);
        System.out.println(x + "+" + comb1 + "+" + comb2);
        System.out.println(comb2 + "+" + x + "+" + comb1);
    }
    return comb3(x-1);
}

}

如果添加一点日志记录,您可以看到为什么会发生重复

1:1:1
2:1:1
3:1:1
3 + 1 + 1
4:1:1
3:2:1
3:1:2
2:2:1
2 + 2 + 1
3:2:1
2:3:1
2:2:2
2:1:2
2 + 1 + 2
3:1:2
2:2:2
2:1:3
1:2:1
2:2:1
2 + 2 + 1
3:2:1
2:3:1
2:2:2
1:3:1
1 + 3 + 1
2:3:1
1:4:1
1:3:2
1:2:2
1 + 2 + 2
2:2:2
1:3:2
1:2:3
1:1:2
2:1:2
2 + 1 + 2
3:1:2
2:2:2
2:1:3
1:2:2
1 + 2 + 2
2:2:2
1:3:2
1:2:3
1:1:3
1 + 1 + 3
2:1:3
1:2:3
1:1:4
counter:9

因此,由于您对递增的数字进行递归调用,当您递归调用num2+1时,您需要确保num1小于或等于num2,以避免重复

不幸的是,无法使用静态变量。
1:1:1
2:1:1
3:1:1
3 + 1 + 1
4:1:1
3:2:1
3:1:2
2:2:1
2 + 2 + 1
3:2:1
2:3:1
2:2:2
2:1:2
2 + 1 + 2
3:1:2
2:2:2
2:1:3
1:2:1
2:2:1
2 + 2 + 1
3:2:1
2:3:1
2:2:2
1:3:1
1 + 3 + 1
2:3:1
1:4:1
1:3:2
1:2:2
1 + 2 + 2
2:2:2
1:3:2
1:2:3
1:1:2
2:1:2
2 + 1 + 2
3:1:2
2:2:2
2:1:3
1:2:2
1 + 2 + 2
2:2:2
1:3:2
1:2:3
1:1:3
1 + 1 + 3
2:1:3
1:2:3
1:1:4
counter:9