我正在尝试创建一个程序来查找图中的所有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);
}
对不起任何英语错误,任何帮助都会非常有用!谢谢!
答案 0 :(得分:0)
数组作为引用类型(与作为基元的int不同)。因此,每次通过递归将数组传递给方法时,您只需将引用传递给同一个数组对象。基本上,您不需要传递引用,因为所有方法调用都是对数组字段的引用。
如果每次调用需要一个新的数组实例,则需要创建一个要传入的新数组。
答案 1 :(得分:0)
localAdjacencyMatrix
数组根本不是本地数组。它从外部传递到第一次调用printEulerTourUtil
,然后传递给每个递归调用。因此,每个递归调用都会查看并修改此数组的相同实例。
另一方面,您的destinationVertexes
变量是本地变量。它是在printEulerTourUtil
方法的范围内定义的,因此每次递归执行此方法都会实例化该列表的新实例。
我不确定您需要什么,但如果您的逻辑要求localAdjacencyMatrix
是本地的,您应该在printEulerTourUtil
方法中声明并实例化它。
答案 2 :(得分:0)
由于数组localAdjacencyMatrix
是通过Java引用传递的,因此如果您不想修改原始数组,则需要先在方法顶部克隆它。但请注意,Java clone()方法本身不能在多维数组上工作。请参阅how to clone multidimensional arrays。