#php #arrays #recursion #memory-management #depth-first-search
#php #массивы #рекурсия #управление памятью #поиск в глубину
Вопрос:
Поскольку массивы в php не рассматриваются как объекты, мне приходится вручную ссылаться на них, чтобы рекурсивно заполнить массив или постоянно копировать новые созданные / заполненные массивы из рекурсивных вызовов.
«вернуть» myRecursiveFunc() не вариант, потому что это приведет к завершению функции в неподходящее время.
Один из способов: ссылка
public function depthFirstSearchInOrder()
{
$list = []; //otherwise php screams that only variables can be referenced (inside traverseInOrder)
//Otherwise I would have passed an empty [] as second parameter
return traverseInOrder($this->root, $list);
}
function traverseInOrder($node, amp;$list)
{
if ($node->left) {
traverseInOrder($node->left, $list);
}
$list[] = $node->value;
if ($node->right) {
traverseInOrder($node->right, $list);
}
return $list;
}
Второй способ: создание / копирование массивов
public function depthFirstSearchInOrder()
{
return traverseInOrder($this->root);
}
function traverseInOrder($node, $list = [])
{
if ($node->left) {
$list = traverseInOrder($node->left, $list);
}
$list[] = $node->value;
if ($node->right) {
$list = traverseInOrder($node->right, $list);
}
return $list;
}
Разве второй способ не занимает намного больше места?
Я создаю новые массивы для каждого рекурсивного вызова, которые затем снова копирую в $list .
Или я просто запутался в данный момент?
Если бы я должен был пройти по этому дереву
// 9,
// 4, 20
// 1, 6, 15 170
Используя второй способ
- Я бы начал с 9
- Идите налево и вызывайте recursive (из-за 4)
- Перейдите налево и вызовите recursive (из-за 1)
- Я заполняю свой пустой массив значением 1 и возвращаю массив [1]
- Я вернулся к значению 4, где я теперь присваиваю $list = [1] (который теперь является копией [1], А НЕ ссылкой, верно? Значит, массив [1] все еще существует где-то после этого?
- Я нажимаю 4 в массиве [1,4] и иду вправо (из-за 6)
- Я помещаю 6 в массив [1,4,6] и возвращаю этот массив [1,4,6]
- Я вернулся к значению 4, где я теперь присваиваю $list = [1,4,6] (который теперь является копией [1,4,6], А НЕ ссылкой, верно? Значит, массив [1,4,6] все еще существует где-то после этого?
И так далее и тому подобное…
Вернемся к моему вопросу:
Разве второй способ не требует больше места? Или я просто запутался в данный момент?