是否可以使用对象进行递归?

时间:2012-11-02 16:13:36

标签: java object recursion

我有一个名为Program的类,它持有一个网格。它有两个方法possi(),它可以保存所有可能进入网格的方法,并使用所有可能的入口点和方法解决方法保存ArrayList possi,实际进入并使用提供的入口点进入网格。我已经使用dfs和bfs完成了mazesolvers但是我的问题是解决实际上通常会更改网格通常bfs和dfs不会占用更改的迷宫。这就是我不使用它们的原因。我想通过切入点和更多点的所有可能性。我的第一级入口点存储在lev1.possi中,我可以遍历它们。然后我必须创建一个新的网格实例,因为solve将改变结构并应用求解然后从该新对象返回新的possi。所以基本上我是为每个变化创建一个新对象。问题是grid.clone()没有创建一个新对象,而是仍然引用我的旧网格。

    Program lev1 = new Program();//initializes grid randomly
    lev1.possi();//calculates entry points and stores in possi

    ArrayList<Program> lev = new ArrayList<Program>();//stores all possible objects
    for (int i = 0; i < lev1.possi.size(); i++)//loops through all entry points
    {
        Program pick = new Program(lev1.grid.clone());//makes a new object
        lev.add(pick);
        lev.get(i).solve(lev1.possi.get(i));//changes the new object
        lev.get(i).possi();//calculates further points to go through
    }

2 个答案:

答案 0 :(得分:1)

我认为grid是一种复杂类型,它包含复杂类型,如数组等。在这种情况下,clone()不会创建深层副本(即它不会递归地克隆部分,如数组)。

以下是复杂类型的clone()方法的示例:在此示例中,我们有一个FlightLogEntry类型,其中包含TreeMap。要克隆FlightLogEntry,我们需要创建一个新的TreeMap并使用原始元素填充地图。在此示例中,未克隆这些元素(clone.setAttendant(p, this.attendats.get(p))。如果您需要克隆方法中更深的副本(这取决于克隆的用法),您可能希望克隆出席者,如下所示:clone.setAttendant(p, this.attendats.get(p).clone()

@Override
public FlightLogEntry clone() {
    FlightLogEntry clone = (FlightLogEntry) super.clone();
    clone.attendants = new TreeMap<Person, Duty>();
    for( Person p : this.attendants.keySet() ) {
        clone.setAttendant(p, this.attendants.get(p));
    }
    return clone;
}

答案 1 :(得分:0)

您需要在Program(网格)构造函数中实例化一个新的网格对象,然后使用新网格分配旧网格中的值。