Использование пространства рекурсии DFS PHP

#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
 

Используя второй способ

  1. Я бы начал с 9
  2. Идите налево и вызывайте recursive (из-за 4)
  3. Перейдите налево и вызовите recursive (из-за 1)
  4. Я заполняю свой пустой массив значением 1 и возвращаю массив [1]
  5. Я вернулся к значению 4, где я теперь присваиваю $list = [1] (который теперь является копией [1], А НЕ ссылкой, верно? Значит, массив [1] все еще существует где-то после этого?
  6. Я нажимаю 4 в массиве [1,4] и иду вправо (из-за 6)
  7. Я помещаю 6 в массив [1,4,6] и возвращаю этот массив [1,4,6]
  8. Я вернулся к значению 4, где я теперь присваиваю $list = [1,4,6] (который теперь является копией [1,4,6], А НЕ ссылкой, верно? Значит, массив [1,4,6] все еще существует где-то после этого?

И так далее и тому подобное…

Вернемся к моему вопросу:

Разве второй способ не требует больше места? Или я просто запутался в данный момент?