Функция вызова PHP из функции - PullRequest
0 голосов
/ 18 декабря 2018

Может кто-нибудь объяснить мне, что на самом деле происходит в функции?

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,?А как поступить с вызовом этой же функции из функции?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Это эффект рекурсии.Переменная b всегда находится в локальной области действия функции.При первом запуске функции значение b равно 0, следовательно, достигает значения for.Синтаксис ++b означает, что b увеличивается до оценки, поэтому при достижении f(++b) с b == 0 он становится f(1).Затем функция запускает цикл с b == 1 и достигает значения for.В этот момент, вопреки тому, что вы ожидали, у вас есть первое, что все еще ожидает завершения рекурсии, когда вы начинаете новый цикл рекурсии.Это также происходит для следующей рекурсии, с 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.
0 голосов
/ 18 декабря 2018

Прежде всего он вызывает 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,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...