我正在尝试编写一个递归方法,该方法接受作为正整数num参数并返回方程的解数
x1 + x2 + x3 = num
当三个xs为1到10之间的正整数时。 该方法还应该打印出这些解决方案,每个解决方案都放在单独的行中。打印顺序无关紧要。
我尝试过:
public static int solutions (int x1, int x2, int x3, int counter, int num)
{
if(x1 > 10 || x2 > 10 || x3 > 10) {
return 0;
}
if (x1 + x2 + x3 == num) {
System.out.println(x1 + "+" + x2 + "+" + x3);
counter = 1;
} else {
return solutions (x1 + 1, x2, x3, counter, num) +
solutions (x1, x2 + 1, x3, counter, num) +
solutions (x1, x2, x3 + 1, counter, num);
}
return counter;
}
public static int solutions (int num)
{
if (num < 3 || num > 30) {
return 0;
}
return solutions (1, 1, 1, 0, num);
}
问题是我重复了结果,问题是我得到了重复的结果,例如num = 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
代替
1 + 1 + 3
1 + 2 + 2
1 + 3 + 1
2 + 1 + 2
2 + 2 + 1
3 + 1 + 1
如何避免重复两次?
答案 0 :(得分:1)
这绝对是您提供的代码的预期行为;第一次调用您的函数将执行此操作(为了简洁起见,我删除了最后两个参数):
return solutions(2, 1, 1) + solutions(1, 2, 1) + solutions(1, 1, 2)
假设您为所有三个参数加1直到达到10,那么(例如)您会期望2 + 2 + 1
在某个时刻由第一次调用和第二次调用产生。
解决问题的一种方法是通过某种递归传递某种收集对象,每次找到对象时,便向其添加解决方案。然后,当您找到一个新商品时,您会检查商品中是否包含该商品,并检查其总数是否正确。
答案 1 :(得分:0)
这是我的处理方式:
public static void main(String[] args) {
System.out.println("Number of solutions: "+ solutions(5));
}
public static int solutions(int num)
{
if (num < 3 || num > 30)
return 0;
else
return solutions(num, 1, 1, 1);
}
private static int solutions(int num, int x1, int x2, int x3)
{
int valid = 0;
if (x1 + x2 + x3 == num)
{
valid = 1;
System.out.println(x1 + " + " + x2 + " + " + x3 + " = " + num);
}
if ((x3 < 10) && (x1 + x2 + x3 < num))
{
return valid + solutions(num, x1, x2, ++x3);
}
else if ((x2 < 10) && (x1 + x2 < num))
{
return valid + solutions(num, x1, ++x2, 1);
}
else if ((x1 < 10) && (x1 < num))
{
return valid + solutions(num, ++x1, 1, 1);
}
else
{
return valid;
}
}
答案 2 :(得分:0)
这就是我想出的……(它适用于方程中的任意数量的变量)
public static int solutions(int num)
{
return solutions(num, 3, 1, ""); // 'varsInTheEq' represents the numbers of varibelas in the equation (in this case: 'x1 + x2 + x3 = num' which is 3)
}
private static int solutions(int num, int varsInTheEq, int value, String builder)
{
if (num == 0 && varsInTheEq == 0) // if we solved the equation
{
System.out.println(builder);
return 1;
}
if (varsInTheEq == 0 || value > num)
return 0;
int r1 = solutions(num - value, varsInTheEq - 1, 1, builder + value + " ");
int r2 = solutions(num, varsInTheEq, value + 1, builder);
return r1 + r2;
}