Рекурсивный цикл для универсального дерева


В течение нескольких дней я пытаюсь решить следующую проблему. Предполагается, что рекурсивная функция перебирает словарь, который в основном является представлением дерева.

Входные данные выглядят следующим образом:

var connections = {1:[2, 3, 4], 2:[5, 6, 7], 3:[8], 4:[9, 10]}

И соответствующее дерево, которое он представляет, выглядит следующим образом:

дерево, представленное словарем 'connections'

Промежуточная цель состоит в том, чтобы вывести числа в defht первом порядке поиска, а именно:

как должен выглядеть результат

Мое решение этой проблемы это:

function dfs(connections, parent) {
    console.log(parent);
    if (!(parent in connections)) {
      return;
    }

    for (i = 0; i < connections[parent].length; i++) {
      dfs(connections, connections[parent][i]);
    }
    return;
}

Однако вызов функции

dfs(connections, 1)

Приводит к следующему результату:

1
2
5
6
7

Это означает, что он не возвращается к предыдущей функции и продолжает цикл for. Если у вас есть какие-то идеи, я буду очень благодарен.

Ура

1 2

1 ответ:

Ваш i неявно глобален, поэтому после итерации через 2 (которая имеет длину 3), i равно 4, поэтому дальнейшие тесты i < connections[parent].length терпят неудачу.

Вы можете использовать let, чтобы исправить это (for (let i = 0), но, вероятно, было бы лучше использовать forEach вместо этого: методы массива менее подробны, менее подвержены ошибкам и более функциональны, чем for циклы:

var connections = {
  1: [2, 3, 4],
  2: [5, 6, 7],
  3: [8],
  4: [9, 10]
}

function dfs(connections, parent) {
  console.log(parent);
  if (!(parent in connections)) {
    return;
  }
  connections[parent].forEach(prop => dfs(connections, prop));
}
dfs(connections, 1)