Почему эта рекурсивная функция работает так?

Я пытаюсь выучить рекурсию и написал функцию, которая берет число и считает его до нуля, а затем снова считает до исходного числа, функция работает, но я не понимаю, почему она работает так, как работает , Я понимаю, почему первая печать после оператора else печатает: «5 4 3 2 1», а затем число равно 0, а инструкция if печатает: «0». Именно после этого сценария я не понимаю, так как теперь функция входит во второй вывод после оператора else и выводит: «1 2 3 4 5», что очень странно для меня. Я был бы очень признателен, если бы кто-то мог мне это объяснить.

<?php
function rec_downandup($num){
if($num == 0){
print '0 ';
}else{
print $num.' ';
rec_downandup($num-1);
print $num.' ';
}
}
rec_downandup(5);
?>

Выход

5 4 3 2 1 0 1 2 3 4 5

1

Решение

Когда вы присмотритесь, это должно стать ясно.

print $num.' ';
rec_downandup($num-1);
print $num.' ';

За ваш первый вклад вы получите

print 5.' ';
rec_downandup(4);
print 5.' ';

и после этого звонка

print 5.' ';
print 4.' ';
rec_downandup(3);
print 4.' ';
print 5.' ';

Таким образом, кажется, что функции ведут обратный отсчет и повышаются, но на самом деле они просто ведут обратный отсчет и размещают каждое число дважды — второй раз в обратном порядке, поэтому кажется, что он ведет обратный отсчет.

8

Другие решения

Ответ @kingero точен, он точно объясняет, что происходит. Если вы хотите иметь прямой обратный отсчет, вы бы сделали это —

function rec_downandup($num){
if($num == 0){
print '0 ';
}else{
echo $num;
$num = rec_downandup($num-1); // you can do this without the variable assignment, it just seems neater this way.
}
}
rec_downandup(5);
0

Каждый раз re_downandup() функция вызывается, параметр $num принимает значение, переданное функции, и будет сохранять это значение до тех пор, пока функция не завершится в своей последней закрывающей скобке.

Также важно понимать, что при наличии рекурсивного вызова функции поток выполнения продолжается в этом вызове, поэтому второй print не произойдет, пока выполнение не вернется из указанного рекурсивного вызова.

Итак, давайте возьмем это:

print $num.' ';
rec_downandup($num-1);
print $num.' ';

Первый print $num напечатает число, затем поток выполнения продолжится при новом вызове функции, который покажет значение переменной минус один. Это будет происходить рекурсивно до $num достигает нуля.

Когда условие рекурсии нарушается $num == 0 задано, функция будет «допущена» до конца; поэтому каждый рекурсивный вызов будет возвращаться, и тогда второй print $num начнет выполняться, потому что это то, что происходит, когда поток выполнения вашей программы возвращается из rec_downandup(),

Значение, напечатанное в этом случае, будет любым значением $num переменная была, когда был вызван рекурсивный вызов.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector