Рекурсия : возврат массива в обратном порядке

Я тренирую мозги, и изучаю алгоритмы.

$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 шт):

Автор решения: Beneviento

Проблема в том, что при каждом вызове функции 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));
→ Ссылка