递归查找三个数字的组合,这些数字相加得出给定的数字

时间:2019-05-12 22:20:56

标签: 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 == 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);
  }

我似乎得到了重复,例如5-

3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
2 + 2 + 1
1 + 3 + 1
1 + 2 + 2
2 + 1 + 2
1 + 2 + 2
1 + 1 + 3

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

2 个答案:

答案 0 :(得分: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 :(得分:0)

我怀疑我的代码远不是一个好的解决方案,但是谁知道呢,也许它将以某种方式对您有所帮助。

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

}