Может кто-нибудь объяснить мне, что на самом деле происходит в функции?
function f($b=0)
{
echo $b.',';
/*otuput is 0,1,2,3,4,5,3,4,2,3,4,5,3,*/
if ($b<3)
{
/*echo $b.',';
when echo is here, otuput is 0,1,2,2,*/
for ($a=0;$a<3;$a++)
{
/*echo $b.',';
when echo is here, otuput is 0,1,2,3,4,2,3,1,2,3,4,2,*/
f(++$b);
}
}
}
f();
Почему вывод не 0,1,2,0,1,2,0,1,2,
?
А как поступить с вызовом одной и той же функции из функции?
Прежде всего это вызывает f(0)
так что отображает 0
,
Тогда это вызывает f(1)
, f(2)
& f(3)
соответственно.
f(1)
: Отображает 1
и работает f(2)
, f(3)
& f(4)
,
f(2)
: Отображает 2
и работает f(3)
, f(4)
& f(5)
,
f(3)
: Отображает 3
только
f(4)
: Отображает 4
только
f(5)
: Отображает 5
только
…
Так:
f(0):
{
0,
f(1):
{
1,
f(2):
{
2,
f(3):
{
3
},
f(4):
{
4
},
f(5):
{
5
}
},
f(3):
{
3
},
f(4):
{
4
}
},
f(2):
{
2,
f(3):
{
3
},
f(4):
{
4
},
f(5):
{
5
}
},
f(3):
{
3
}
}
Итак, вывод: 0,1,2,3,4,5,3,4,2,3,4,5,3,
Это эффект рекурсии. Переменная b
всегда находится в локальной области функции. Когда вы впервые запускаете функцию, b
значение равно 0, поэтому достигает для. ++b
Синтаксис означает, что b увеличивается до оценки, поэтому при достижении f(++b)
с b == 0
становится f(1)
, Затем функция начинает цикл с b == 1
и достигает для. В этот момент, вопреки тому, что вы ожидали, у вас есть первое, что все еще ожидает завершения рекурсии, когда вы начинаете новый цикл рекурсии. Это также происходит для следующей рекурсии, с b==2
, Итак, используя некоторые отступы для пояснения циклов:
// Prints 0
for ($a = 0; $a < 3; $a++)
f(++$b) // $b == 0, $a == 0
// Prints 1
for ($a = 0; $a < 3; $a++)
f(++$b) // $b == 1, $a == 0
// Prints 2
for ($a = 0; $a < 3; $a++)
f(++$b) // $b == 2, $a == 0
// Prints 3, no further cycles
f(++$b) // $b == 3, $a == 1
// Prints 4, no further cycles
f(++$b) // $b == 4, $a == 2
// Prints 5, no further cycles
// The function returns having completed the cycle
f(++$b) // $b == 2, $a == 1
// Prints 3, no further cycles
f(++$b) // $b == 3, $a == 2
// Prints 4, no further cycles
// The function returns having completed the cycle
f(++$b) // $b == 1, $a == 1
// Etc. etc.