Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.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 如何递归地解决ArrayList的问题_Java_Algorithm_Recursion - Fatal编程技术网

Java 如何递归地解决ArrayList的问题

Java 如何递归地解决ArrayList的问题,java,algorithm,recursion,Java,Algorithm,Recursion,我想写一个“解圆”的程序。Circle类包含三角形对象的ArrayList和整数的ArrayList。每个三角形对象都有三个int实例字段,表示每个三角形顶点处的三个数字。还有一个Pairs类(您可以在“代码”部分看到我的所有代码) 以下是使用四个未求解的三角形进行设置的示例: 这里是“解决”后的同一个圆: 第二张图中的圆是一个已解圆,因为圆的任意圆弧上的数字等于它旁边的两个顶点数之和:6=1+5、15=6+9、11=7+4和9=5+4。请注意,这是通过旋转给定的三角形获得的。在代码中,这对

我想写一个“解圆”的程序。Circle类包含三角形对象的ArrayList和整数的ArrayList。每个三角形对象都有三个int实例字段,表示每个三角形顶点处的三个数字。还有一个Pairs类(您可以在“代码”部分看到我的所有代码) 以下是使用四个未求解的三角形进行设置的示例:

这里是“解决”后的同一个圆:

第二张图中的圆是一个已解圆,因为圆的任意圆弧上的数字等于它旁边的两个顶点数之和:6=1+5、15=6+9、11=7+4和9=5+4。请注意,这是通过旋转给定的三角形获得的。在代码中,这对于简单地更改每个三角形的解决方案中存在的对(其中“对”是两个整数的对象,其中这些整数是每个三角形的圆上的值)是非常有用的

圆并不总是以“已解决”状态给出。如果是这种情况,可以旋转三角形,使圆处于已求解状态。任何给定圆的先决条件是存在一个已解状态,因此数字将始终对齐

一个圆总是至少有两个三角形,并且没有(实际的)最大数量。每个给定的圆总是可解的,这意味着有一种方法可以旋转每个三角形,使圆上的数字是两个不同三角形的两个相邻顶点之和的结果

程序的要点是不改变任何给定的实例字段;相反,我只想创建一个名为solveCircle的方法,该方法返回一个表示圆的解决方案的ArrayList对。在上面的示例中,solveCircle方法将返回包含以下对的ArrayList:(4,1)、(5,6)、(9,7)、(4,5)。这些对在解决方案中,因为它们都是三角形上的数字对,并且每对都在圆上。请注意,该解决方案是逆时针绕圆圈运行的

我的直觉告诉我,这个过程应该涉及某种类型的递归,因为由于循环的循环性质,循环会很棘手;换句话说,我可以循环通过每一对三角形找到合适的解,但很容易会有不止一个,将每一个与下一个求和的解进行比较似乎效率低下;递归似乎是一个更好的选择,但我不确定将递归应用于什么…我应该使用什么算法,甚至基本情况是什么

public class Triangle
{
    private int num1;
    private int num2;
    private int num3;

    public Triangle(int n1, int n2, int n3)
    {
        num1 = n1;
        num2 = n2;
        num3 = n3;
    }

    public ArrayList<Pair> getPairs()
    {
        ArrayList<Pair> pairs = new ArrayList<Pair>();
        pairs.add(new Pair(num1, num2));
        pairs.add(new Pair(num2, num3));
        pairs.add(new Pair(num3, num1));
        return pairs;
    }
}
公共类圈子
{
私有阵列列表三角形;
私人ArrayList金额;
公共控制盘(ArrayList s,ArrayList t)
{
三角形=t;
总和=s;
}
公共ArrayList solveCircle()
{
//这里需要帮助吗
}
}
您可以使用a将已求解的三角形与未求解的三角形分开。对于已解的圆和未解的圆也是如此。这样,您将使其成为一个
logn
搜索函数,它将忽略已解决的问题,从而避免不必要的比较

if (solved)
    add to left side of the tree
else 
    add to right side of the tree

根据用例的不同,这种方法的复杂性也可能是一种极端的过度杀伤力。

对于初始步骤,您将调用助手三次:每对调用一次,直到返回成功为止(布尔值可用于表示成功)

助手执行递归步骤

对于递归步骤,您有一个扩展到后面的和,一个必须与之组合以满足该和的整数,以及实现该和的三种可能方法。。。但是,除非递归调用也返回success,否则不会返回success


对于最后一步,不允许旋转,只允许最后一个对或错,因为我是否完成了后面的求和。

我在课堂上还没有学习过关于树的知识,我不能使用任何没有使用过的东西。我不明白你说的“解决的三角形”是什么意思。我不知道三角形是否正确,除非整个圆都正确地解出来。例如,如果我有一个10的和,我有两个相邻的三角形,它们的顶点是3,4,8和7,6,2,那么它们有三种不同的排列方式是正确的;但是,只有一个会根据圆圈中的其他信息工作,即其他和和和其他三角形。请编辑您的问题,并提供一个关于如何接收问题的示例。例如,从这里,我无法理解圆的最大大小,以及问题存在的值的域/范围。这就是为什么我认为它与逆曲率有关,我会检查两个三角形是否正确,然后检查第三个三角形是否正确,如果它确实移动到第四个三角形,但如果没有,请返回并重新访问前两个三角形。我只是不确定如何实现它。编辑了一个“给定”圆的例子,然后是已解决的版本。我需要编写代码,将给定的圆,然后产生一个数组对列表,表示每个三角形的顶点对,这是解决方案的一部分。我不认为这个答案是正确的。三角形不是孤立地“解决”的。它可能需要再次旋转,这取决于后面的内容。“逆时针”,但哪个先到:三角形0还是和0?三角形0会先到,所以我会使用三角形0和三角形1来找到和1,依此类推,直到我得到三角形“size()-1”。然后我会用它和三角形0加和0。总和数组列表的大小将比三角形数组列表的大小小一个。我将使用数独方法。绕圆一周,找到有效方向数最少的三角形。如果只有一个有效方向,请选择该方向,然后锁定三角形。如果有两个或三个有效方向,则选择
public class Circle
{
    private ArrayList<Triangle> triangles;
    private ArrayList<Integer> sums;

    public Wheel(ArrayList<Integer> s, ArrayList<Triangle> t)
    {
        triangles = t;
        sums = s;
    }

    public ArrayList<Pair> solveCircle()
    {
        //need help here
    }
}
if (solved)
    add to left side of the tree
else 
    add to right side of the tree