在递归中保持变量的实例

时间:2014-08-21 14:22:01

标签: java recursion graph

我正在尝试创建一个程序来查找图中的所有Euler路径。为此,我使用的代码改编自:http://www.sanfoundry.com/java-program-implement-euler-circuit-problem/

我的所作所为:我修改了一个递归函数printEulerUtil()(下面),用于测试和查找(方法isValidNextEdge)可能的Euler路径。但是,我的递归方法不存储变量int [] [] localAdjacencyMatrix(它就像一个全局变量,我无法理解),这意味着当递归返回时(例如,在深度第一次搜索中找到第一个Euler路径后,我的变量与最后一个递归调用相同(就像我说的,一个全局变量行为),而不是在程序之前存储“原始”调用的值(在第一次递归调用之前的上下文。)

我做错了什么?毕竟,在递归发生时,所有上下文都不会保存?

这是一段代码(评论):

// in the main call, variable vertex and localAdjacencyMatrix are defined in the constructor.
public void printEulerTourUtil(int vertex, int[][] localAdjacencyMatrix) {

        ArrayList<Integer> destinationVertexes = new ArrayList<>();
        int destination = 1;
        // print the actual vertex
        System.out.println("V: " + vertex);

        for (destination = 1; destination <= numberOfNodes; destination++) {
            // test all possibles destinations
            if (localAdjacencyMatrix[vertex][destination] == 1 && isValidNextEdge(vertex, destination, localAdjacencyMatrix)) {
                // insert these destinations in a list of next vertex for recursion
                destinationVertexes.add(destination);
                System.out.println(destination + " ");
            }
        }

        // make a recursion for every vertex destination in the list.
        for (int i = 0; i < destinationVertexes.size(); i++){
            destination = destinationVertexes.get(i);
            // go to the next vertex in the graph
            System.out.println("-> source : " + vertex + " destination " + destination);

            // localAdjacencyMatrix isn't working. it's like a global variable, so my recursion fails
            removeEdge(vertex, destination, localAdjacencyMatrix);
            printEulerTourUtil(destination, localAdjacencyMatrix);
        }

对不起任何英语错误,任何帮助都会非常有用!谢谢!

3 个答案:

答案 0 :(得分:0)

数组作为引用类型(与作为基元的int不同)。因此,每次通过递归将数组传递给方法时,您只需将引用传递给同一个数组对象。基本上,您不需要传递引用,因为所有方法调用都是对数组字段的引用。

如果每次调用需要一个新的数组实例,则需要创建一个要传入的新数组。

答案 1 :(得分:0)

localAdjacencyMatrix数组根本不是本地数组。它从外部传递到第一次调用printEulerTourUtil,然后传递给每个递归调用。因此,每个递归调用都会查看并修改此数组的相同实例。

另一方面,您的destinationVertexes变量是本地变量。它是在printEulerTourUtil方法的范围内定义的,因此每次递归执行此方法都会实例化该列表的新实例。

我不确定您需要什么,但如果您的逻辑要求localAdjacencyMatrix是本地的,您应该在printEulerTourUtil方法中声明并实例化它。

答案 2 :(得分:0)

由于数组localAdjacencyMatrix是通过Java引用传递的,因此如果您不想修改原始数组,则需要先在方法顶部克隆它。但请注意,Java clone()方法本身不能在多维数组上工作。请参阅how to clone multidimensional arrays