Рекурсивный цикл для универсального дерева
В течение нескольких дней я пытаюсь решить следующую проблему. Предполагается, что рекурсивная функция перебирает словарь, который в основном является представлением дерева.
Входные данные выглядят следующим образом:
var connections = {1:[2, 3, 4], 2:[5, 6, 7], 3:[8], 4:[9, 10]}
И соответствующее дерево, которое он представляет, выглядит следующим образом:
Промежуточная цель состоит в том, чтобы вывести числа в 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 ответ:
Ваш
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)