Рекурсия : возврат массива в обратном порядке
Я тренирую мозги, и изучаю алгоритмы.
$array = [
'0'=> 1,
'1'=> 2,
'2'=> 3,
'3'=> 4,
'4'=> 5,
];
function reverse(array $array,$index = null)
{
static $reverse_array = []; //новый массив для данных
if(is_null($index)){
$index = count($array) -1; //Для первого запуска. Если у нас не передан Index, тогда мы берем кличество элементов -1
}
if($index < 0) { //Если индекс меньше нуля, тогда мы прошли последний 0-вой элемент и мы окончили работу. Возвращаем массив с реверсными данными.
return $reverse_array;
}
$reverse_array[] = $array[$index]; //Записываем в наш новый массив данные в обратном порядке согласно индексу.
reverse($array,$index - 1); //Вызываем заново нашу функцию с уменьшеным индексом.
return $reverse_array; // !!! тут суть вопроса. #СТРОКА НОМЕР 22
}
var_dump(reverse($array));
Вопрос: Если не вернуть массив в 22 строке, то при дампе на возвращается NULL, хотя у нас выше есть условие , что при индексе 0 (последним вызове) мы возвращаем результат нашей рекурсии и прекращаем работу.
Что я не так понимаю?
Ответы (1 шт):
Проблема в том, что при каждом вызове функции reverse, вы создаете новый статический массив $reverse_array. Это приводит к тому, что при каждом шаге рекурсии создается новый массив, и предыдущий массив теряется. Когда вы возвращаете $reverse_array на каждом уровне рекурсии, вы возвращаете только текущий уровень массива, а не конечный результат.
Чтобы решить эту проблему, вы можете передавать массив по ссылке вместо создания нового статического массива на каждом уровне рекурсии. Таким образом, все изменения будут вноситься в один и тот же массив на протяжении всей рекурсии.
$array = [
'0' => 1,
'1' => 2,
'2' => 3,
'3' => 4,
'4' => 5,
];
function reverse(array $array, &$reverse_array = null, $index = null)
{
if (is_null($index)) {
$index = count($array) - 1;
$reverse_array = []; // Инициализируем массив только при первом вызове.
}
if ($index < 0) {
return $reverse_array;
}
$reverse_array[] = $array[$index];
reverse($array, $reverse_array, $index - 1);
return $reverse_array;
}
var_dump(reverse($array));