【发布时间】:2020-10-11 03:57:47
【问题描述】:
我目前正在编写一个在节点之间遍历的递归算法 (DFT)。 但是发生了一些非常奇怪的事情,我的 for each 循环在其中跳过了几行,但只打印出其中 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("Why are before the lines before me didn't getting print out?!") 之前的所有行都被跳过了。
这是我得到的输出。
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 的节点时,为什么会跳过 for each 循环内的行? 我知道他们没有任何边缘相互连接,但为什么 System.out.println("Why are the lines before me didn't getting print out?!") 线被触发而不是 System.out.println (“我发生了!”)例如?我的 for each 是倒退还是什么?这太奇怪了,为什么我的 System.out.println 除了 if 语句之后的那个被忽略了?
【问题讨论】:
-
How is this possible?好吧,既然您没有显示似乎超过一半的代码,那么我们看不到的方法中可能会发生任何事情。 -
什么意思?我已经复制粘贴了所有涉及的代码。
-
由于递归,它正在递归打印,因为这是您递归使用的计算方法。总之,你需要了解递归。
-
谢谢,我以为我理解递归,但这种行为让我很奇怪。我想我没有完全理解它。
标签: java algorithm recursion graph-traversal