Java 返回方程x1+的解数;x2和x2B;x3=num
我正在尝试编写一个递归方法,该方法接受一个正整数num参数,并返回方程的解数Java 返回方程x1+的解数;x2和x2B;x3=num,java,recursion,Java,Recursion,我正在尝试编写一个递归方法,该方法接受一个正整数num参数,并返回方程的解数 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) } priva
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;
}
x1+x2+x3=num
当三个X是介于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);
}
而不是
1 + 1 + 3
1 + 2 + 2
1 + 3 + 1
2 + 1 + 2
2 + 2 + 1
3 + 1 + 1
我怎样才能避免重复两次呢?这绝对是您提供的代码的预期行为;第一次调用函数时,它会这样做(为了简洁起见,我删除了最后两个参数):
返回解决方案(2,1,1)+解决方案(1,2,1)+解决方案(1,1,2)
假设对于所有三个参数,在得到10之前都要加1,那么(例如)2+2+1
将在某个点由第一次和第二次调用生成
您的问题的一个解决方案是通过递归传递某种集合对象,每次找到一个集合对象时,您都会向该对象添加解决方案。然后,当你找到一个新的时,你会检查你的收藏中是否包含了它,以及它的总数是否正确。以下是我的方法:
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;
}
}
publicstaticvoidmain(字符串[]args){
System.out.println(“溶液数量:”+溶液(5));
}
公共静态int解决方案(int num)
{
如果(数值<3 | |数值>30)
返回0;
其他的
返回解(num,1,1,1);
}
私有静态int解决方案(int num、int x1、int x2、int x3)
{
int valid=0;
如果(x1+x2+x3==num)
{
有效=1;
System.out.println(x1+“+”+x2+“+”+x3+“=”+num);
}
如果((x3<10)和&(x1+x2+x3
这就是我想到的。。。(它适用于方程中任意数量的变量)
仅打印
x1的解决方案请注意,您不必搜索x3
的所有值:从num-x1-x2
计算它,如果该值超出1..10范围,则拒绝。假设您有foo(int a,int b){if(这是一个来自开放大学作业的问题,使用java课程介绍计算机科学这有点晚了,但我可以建议优化:将else if((x2<10)和&(x1+x2
替换为else if((x2<10)和&(x1+x2+1
和else if((x1<10)和(x1
withelse if((x1<10)和&(x1+2
以防止冗余递归调用。例如,如果num=5,则为1+4+1、4+1+1、3+2+1和2+3+1进行了4次不需要的调用。
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;
}