Если у вас включен отчет об ошибках, вы увидите три таких уведомления:
Примечание: только переменные должны передаваться по ссылке ...
Это потому, что вы передаете вывод array_slice()
в качестве параметра, на который ссылаются; чтобы исправить это, вы должны объявить вывод `array_slice () как переменную перед тем, как передать его.
Тот факт, что вы видите три Уведомления, фактически указывает на то, что ваш рекурсивный метод обходится так далеко, как предполагалось, и выполняет работать, но результирующий обмен элементов не применяется к предыдущим вызовам $s
- IOW все последующие рекурсивные модификации теряются. ( Демо )
@ arkascha предоставил необходимые исправления к вашему сценарию примерно за час до меня, но я мог бы написать его немного по-другому.
Код: ( Демо)
function swapOutermost(&$a) {
$size = count($a);
if ($size > 1) {
$innerElements = array_slice($a, 1, -1);
swapOutermost($innerElements);
$a = array_merge(
[$a[$size - 1]], // last is put first
$innerElements, // recursed reference in the middle
[$a[0]] // first is put last
);
}
}
count()
только один раз за рекурсивный вызов - arkascha исправил это - no
return
записывается -1
как 3-й параметр array_slice()
имеет тот же эффект, что и ваш $len - 2
.
Вот рекурсивный метод, который использует только повторные вызовы count()
- без среза или объединения, потому что он передает всю исходный массив ввода каждый раз. Во время рекурсии изменяются только целевые индексы. Я меняю местами на основе приращения индекса, используя Symmetri c Разрушение массива ( инструмент, доступный от PHP7 .1 и выше ).
Код: ( Демо )
function swapOutermost(&$a, $i = 0) {
$last = count($a) - 1 - $i;
if ($i < $last) {
[$a[$i], $a[$last]] = [$a[$last], $a[$i]];
swapOutermost($a, ++$i);
}
}
swapOutermost($array);
... конечно, поскольку число никогда не меняется, было бы эффективнее просто передать его один раз и используйте его повторно.
function swapOutermost(&$a, $count, $i = 0) {
$last = $count - 1 - $i;
if ($i < $last) {
[$a[$i], $a[$last]] = [$a[$last], $a[$i]];
swapOutermost($a, $count, ++$i);
}
}
swapOutermost($array, count($array));
Теперь ваш оригинальный фрагмент использует модификацию по ссылке, но вы явно не требуете этого в своих требованиях к вопросу - нужно использовать только рекурсию. Если вы могли бы использовать рекурсивную функцию, которая вместо этого возвращает переменную (потому что, скажем, вы хотите иметь возможность вкладывать этот вызов в другую функцию), то здесь есть один способ, который пропускает все более короткий массив с каждым уровнем рекурсии (как Ваш оригинал сделал):
Код: ( Демо )
function recursiveArrayReverse($a) {
$size = count($a);
if ($size < 2) {
return $a;
}
return array_merge(
[$a[$size - 1]],
recursiveArrayReverse(
array_slice($a, 1, -1)
),
[$a[0]]
);
}
$array = [1, 2, 3, 4, 5, 6, 7];
$array = recursiveArrayReverse($array);