#java #algorithm #recursion #graph-traversal
#java #алгоритм #рекурсия #обход графика
Вопрос:
В настоящее время я пишу алгоритм рекурсии, который проходит между узлами (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(«Почему строки передо мной не распечатываются ?!») пропускаются.
Это результат, который я получаю.
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?!
Как это возможно? Почему пропускаются строки внутри цикла for each, когда я достигаю узла с именем B или узла с именем E?
Я знаю, что у них нет никаких ребер, связанных друг с другом, но почему запускается строка System.out.println(«Почему строки передо мной не распечатываются ?!»), Но не System.out.println(«Я случился!»), Например? Мой for each возвращается назад или что-то в этом роде? Это так странно, почему мой System.out.println игнорируется, кроме одной после оператора if?
Комментарии:
1.
How is this possible?
Ну, поскольку вы не показываете то, что кажется более чем половиной вашего кода, в методах, которые мы не видим, может происходить что угодно.2. Что вы имеете в виду? Я скопировал весь задействованный код.
3. Из-за рекурсии выполняется рекурсивная печать, потому что это метод вычисления, который вы используете рекурсивно. Короче говоря, вам нужно понимать рекурсию.
4. Спасибо, чувак, я думал, что понял рекурсию, но это поведение меня удивило. Наверное, я не совсем понял это.
Ответ №1:
Я попытался упростить порядок выполнения, вставив вызовы функций и табулируя эти выходные данные. Надеюсь, это поможет. Вы можете видеть, почему строки передо мной не распечатываются ?!печатается столько же раз, сколько и у меня!, поэтому ничего не пропущено.
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?!