【发布时间】:2014-08-21 14:22:00
【问题描述】:
我正在尝试编写一个程序来查找图中的所有欧拉路径。为此,我使用了改编自此的代码:http://www.sanfoundry.com/java-program-implement-euler-circuit-problem/
我做什么:我修改了一个递归函数 printEulerUtil()(如下)用于测试并找到(方法 isValidNextEdge)可能的欧拉路径。但是,我的递归方法没有存储变量 int[][] localAdjacencyMatrix (它就像一个全局变量,我看不懂),这意味着当递归返回时(例如,在深度优先搜索中找到第一个欧拉路径之后),我的变量与最后一次递归调用相同(就像我说的,全局变量行为),而不是在程序中存储之前“原始”调用的值(第一次递归调用之前的上下文)。
我做错了什么?毕竟,递归发生时不会保存所有上下文?
这是一段代码(已注释):
// 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);
}
对不起,任何英语错误,任何帮助都将非常有用!谢谢!
【问题讨论】:
-
您正在使用
localAdjacencyMatrix递归地传递给该方法。请注意,它不是全局的,它只是传递给同一方法的引用。