Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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,我的任务是编写一个程序,接收介于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
。这就是这个解决方案所做的,我认为这应该是他尝试的结果。我删除了我的答案。