Java 三元方程的打印解
我的任务是编写一个程序,接收介于Java 三元方程的打印解,java,recursion,Java,Recursion,我的任务是编写一个程序,接收介于3和30之间的数字,返回方程x1+x2+x3=num,其中x1、x2和x3是介于1和10之间的数字 它还打印这些解决方案。例如,对于num=5,它返回6,并打印以下内容: 1+1+3 1 + 2 + 2 1 + 3 + 1 2 + 1 + 2 2 + 2 + 1 3 + 1 + 1 我需要使用递归 问题的复杂性并不重要。我想我成功地做到了这一点,复杂性为3^n(这是可怕的)。但是,同样的答案也会被多次计数,所以这是一个无效的答案 public static in
3
和30
之间的数字,返回方程x1+x2+x3=num
,其中x1
、x2
和x3
是介于1
和10
之间的数字
它还打印这些解决方案。例如,对于num=5
,它返回6
,并打印以下内容:
1+1+3
1 + 2 + 2
1 + 3 + 1
2 + 1 + 2
2 + 2 + 1
3 + 1 + 1
我需要使用递归
问题的复杂性并不重要。我想我成功地做到了这一点,复杂性为3^n(这是可怕的)。但是,同样的答案也会被多次计数,所以这是一个无效的答案
public static int solutions(int num) {
if (num <3 || num > 30)
return 0;
return solutions(num, 1, 1, 1);
}
public static int solutions(int num, int x1, int x2, int x3) {
if (x1 > 10 || x2 > 10 || x3 > 10)
return 0;
int count, val1, val2, val3;
if (x1 + x2 + x3 == num) {
System.out.println(x1+" + "+x2+" + "+x3);
count = 1;
} else
count = 0;
val1 = solutions(num, x1+1, x2, x3);
val2 = solutions(num, x1, x2+1, x3);
val3 = solutions(num, x1, x2, x3+1);
return count + val1 + val2 + val3;
}
公共静态int解决方案(int num){
如果(数字30)
返回0;
返回解(num,1,1,1);
}
公共静态int解决方案(int num、int x1、int x2、int x3){
如果(x1>10 | | x2>10 | | x3>10)
返回0;
整数计数,val1,val2,val3;
如果(x1+x2+x3==num){
System.out.println(x1+“+”+x2+“+”+x3);
计数=1;
}否则
计数=0;
val1=溶液(num,x1+1,x2,x3);
val2=溶液(num,x1,x2+1,x3);
val3=溶液(num,x1,x2,x3+1);
返回计数+val1+val2+val3;
}
您可以使用列表
确保不会打印重复出现的内容。每当打印一行时,将(x1,x2,x3)的列表添加到列表中,并通过返回1来增加计数
演示:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
System.out.println(solutions(5));
}
public static int solutions(int num) {
if (num < 3 || num > 30)
return 0;
return solutions(num, 1, 1, 1, new ArrayList<>());
}
public static int solutions(int num, int x1, int x2, int x3, List<List<Integer>> list) {
if (x1 + x2 + x3 == num) {
if (!list.contains(List.of(x1, x2, x3))) {
list.add(List.of(x1, x2, x3));
System.out.println(x1 + " + " + x2 + " + " + x3);
return 1;
}
return 0;
}
return solutions(num, x1 + 1, x2, x3, list) + solutions(num, x1, x2 + 1, x3, list)
+ solutions(num, x1, x2, x3 + 1, list);
}
}
3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
1 + 3 + 1
1 + 2 + 2
1 + 1 + 3
6
您可以使用列表
确保不会打印重复出现的内容。每当打印一行时,将(x1,x2,x3)的列表添加到列表中,并通过返回1来增加计数
演示:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
System.out.println(solutions(5));
}
public static int solutions(int num) {
if (num < 3 || num > 30)
return 0;
return solutions(num, 1, 1, 1, new ArrayList<>());
}
public static int solutions(int num, int x1, int x2, int x3, List<List<Integer>> list) {
if (x1 + x2 + x3 == num) {
if (!list.contains(List.of(x1, x2, x3))) {
list.add(List.of(x1, x2, x3));
System.out.println(x1 + " + " + x2 + " + " + x3);
return 1;
}
return 0;
}
return solutions(num, x1 + 1, x2, x3, list) + solutions(num, x1, x2 + 1, x3, list)
+ solutions(num, x1, x2, x3 + 1, list);
}
}
3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
1 + 3 + 1
1 + 2 + 2
1 + 1 + 3
6
我将使用的算法首先是:
n-211
然后我会用一种方法做一个除法。基本上,改变上述组合的最简单方法是从第一个组合中取一个,然后将一个添加到第二个或第三个组合中,这样就可以得到可能的结果
n-3 2 1
或
n-3 1 2
您将始终从第一个元素中获取一个元素,并且始终有两个案例。因此,病例数量大约为(n-2)^2。我说“大致”,因为会有一些重复,例如
1 2 2
可从以下地址联系到
2 1 2
来自
2 2 1
要处理重复项,请检测重复项并仅考虑一次。例如,当您添加到中间时,会考虑到一个副本,但在添加到最右边的数字时,则不会考虑该副本。我将使用的算法是从以下开始:
n-211
然后我会用一种方法做一个除法。基本上,改变上述组合的最简单方法是从第一个组合中取一个,然后将一个添加到第二个或第三个组合中,这样就可以得到可能的结果
n-3 2 1
或
n-3 1 2
您将始终从第一个元素中获取一个元素,并且始终有两个案例。因此,病例数量大约为(n-2)^2。我说“大致”,因为会有一些重复,例如
1 2 2
可从以下地址联系到
2 1 2
来自
2 2 1
要处理重复项,请检测重复项并仅考虑一次。例如,当您添加到中间时,会考虑重复,但添加到最右边的数字时,不会考虑重复。如果不计算重复,它不应该返回2吗?@RetoHöhener-不,这里重复表示重复序列,例如,1+2+2
和1+2+2
是重复序列。这是根据OP在问题中提到的要求。从问题中我不清楚。OP显示了他试图返回6的尝试,但写到它不正确地计数重复项。@RetoHöhener-OP给出了一个例子并提到:例如,对于num=5,它返回6并打印以下内容:1+1+31+2+21+3+12+1+2+2+13+1+1
。这就是这个解决方案所做的,我认为这应该是他尝试的结果。我删除了我的答案。如果不计算重复项,它不应该返回2吗?@RetoHöhener-不,这里重复表示重复序列,例如1+2+2
和1+2+2
是重复序列。这是根据OP在问题中提到的要求。从问题中我不清楚。OP显示了他试图返回6的尝试,但写到它不正确地计数重复项。@RetoHöhener-OP给出了一个例子并提到:例如,对于num=5,它返回6并打印以下内容:1+1+31+2+21+3+12+1+2+2+13+1+1
。这就是这个解决方案所做的,我认为这应该是他尝试的结果。我删除了我的答案。