Пропускаются все строки, кроме последней внутри цикла for each

#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?!