问题描述
我目前正在编写一个在节点之间遍历的递归算法(DFT)。 但是确实发生了一件很奇怪的事情,我的每个循环都跳过了其中的几行,但是只打印出其中if语句之后的内容。
这是我的Main.java的样子
g.addNode("A");
g.addNode("B");
g.addNode("E");
g.addEdge("A","B");
g.addEdge("A","E");
g.traverseDepthFirst("A");
非常简单,只需添加节点,然后将它们彼此连接(addEdge)。
现在,在我的递归方法中,这才变得很奇怪。
public void traverseDepthFirst(String root) {
var node = nodes.get(root);
if (node == null) {
return;
}
traverseDepthFirst(node,new HashSet<>());
}
private void traverseDepthFirst(Node root,Set<Node> visited) {
System.out.println("Node: " + root);
visited.add(root);
System.out.println("Visited: " + visited);
for (var node : adjacencyList.get(root)) {
System.out.println("I happened!");
System.out.println(root + " contains " + adjacencyList.get(root));
System.out.println("Node from adjacencyList: " + node);
if (!visited.contains(node)) {
System.out.println("Happened!");
traverseDepthFirst(node,visited);
}
System.out.println("Why are the lines before me not getting printed out?!");
}
}
当我到达节点“ B”和“ E”时,将跳过System.out.println(“为什么前面的行未打印出来?!”)行之前的所有行。
这是我得到的输出。
Node: A
Visited: [A]
I happened!
A contains [B,E]
Node from adjacencyList: B
Happened!
Node: B
Visited: [A,B]
Why are the lines before me not getting printed out?!
I happened!
A contains [B,E]
Node from adjacencyList: E
Happened!
Node: E
Visited: [E,A,B]
Why are the lines before me not getting printed out?!
这怎么可能?当到达名为B的节点或名为E的节点时,为什么跳过每个循环中的行? 我知道它们之间没有任何相互连接的边缘,但是为什么触发了System.out.println(“为什么前面的行未打印出来?!”)行却未触发System.out.println (例如“我发生了!”)?是我的每一个倒退还是什么?这太奇怪了,为什么我的System.out.println除了if语句之后的那个被忽略?
解决方法
我试图通过插入函数调用并用制表符标记这些输出来使执行顺序更易于阅读。希望对您有所帮助。您可以看到为什么为什么我前面的行没有被打印出来?!被打印的次数与我发生的次数一样!,所以没有跳过任何内容。
traverseDepthFirst(A,#{})
Node: A
Visited: [A]
for node <- B
I happened!
A contains [B,E]
Node from adjacencyList: B
Happened!
traverseDepthFirst(B,#{A})
Node: B
Visited: [A,B]
Why are the lines before me not getting printed out?!
for node <- E
I happened!
A contains [B,E]
Node from adjacencyList: E
Happened!
traverseDepthFirst(E,#{A,B})
Node: E
Visited: [E,A,B]
Why are the lines before me not getting printed out?!