echo $x; //여기의 출력은 메모리에 유지되며 이 프로세스를 실행하기 전에 이전 실행이 완료될 때까지 기다립니다.
}
one(5);
프로세스를 먼저 실행하고 5(1씩 증가하면 6이 되어 10보다 작아짐)를 출력하고 계속해서 실행하는데 이때 마지막 echo $x(6 )는 실행될 프로세스 1번으로 유지됩니다
계속 실행되어 6을 출력하고 (1씩 증가하여 7이 되고 10보다 작아짐) 계속해서 실행되는데 이때 마지막 echo $x(7 )는 2번 프로세스로 유지되어 실행됩니다
계속 실행하면 출력 7, (1씩 증가, 8이 되어 10보다 작아짐,) 스스로 계속 실행하지만 이때 마지막 echo $x(8) 3번 프로세스가 실행되도록 예약되어 있습니다
계속 실행하면 출력 8, (1씩 증가하여 9가 되고 10보다 작아짐) 계속해서 스스로 실행되는데 이때 마지막 echo $x(9)는 4번 프로세스로 실행되도록 예약됨
계속 실행, 출력 9, (증분 1. 10 이상, 10이 됨) 더 이상 출력 10을 계속 실행하지 않습니다. 표면적으로는 실행이 완료됩니다.留 하지만 이전에 실행되도록 예약된 프로세스가 있고 그 다음에는 일대일 실행에 [기억하세요, 이것이 실행입니다]. 따라서 역순 상황이 발생합니다.
PHP 중국어 웹사이트 Q&A - PHP 중국어 웹사이트 Q&A를 어떻게 이해하나요? - PHP 중국어 웹사이트 Q&A
둘러보고 배워보세요.
function one($x){
echo $x;
$x++;
if($x<10) one($x);
else echo "메모리 예약 프로세스 실행 시작";
echo $x; //여기의 출력은 메모리에 유지되며 이 프로세스를 실행하기 전에 이전 실행이 완료될 때까지 기다립니다.
}
one(5);
프로세스를 먼저 실행하고 5(1씩 증가하면 6이 되어 10보다 작아짐)를 출력하고 계속해서 실행하는데 이때 마지막 echo $x(6 )는 실행될 프로세스 1번으로 유지됩니다
계속 실행되어 6을 출력하고 (1씩 증가하여 7이 되고 10보다 작아짐) 계속해서 실행되는데 이때 마지막 echo $x(7 )는 2번 프로세스로 유지되어 실행됩니다
계속 실행하면 출력 7, (1씩 증가, 8이 되어 10보다 작아짐,) 스스로 계속 실행하지만 이때 마지막 echo $x(8) 3번 프로세스가 실행되도록 예약되어 있습니다
계속 실행하면 출력 8, (1씩 증가하여 9가 되고 10보다 작아짐) 계속해서 스스로 실행되는데 이때 마지막 echo $x(9)는 4번 프로세스로 실행되도록 예약됨
계속 실행, 출력 9, (증분 1. 10 이상, 10이 됨) 더 이상 출력 10을 계속 실행하지 않습니다. 표면적으로는 실행이 완료됩니다.留 하지만 이전에 실행되도록 예약된 프로세스가 있고 그 다음에는 일대일 실행에 [기억하세요, 이것이 실행입니다]. 따라서 역순 상황이 발생합니다.
글쎄, 재귀함수를 초보자가 이해하기 어려운 이유가 바로 이것이다.
还可参考这篇文章:php递归函数典型例子
很多同学在学习递归函数的时候会感到头晕,无法搞清楚递归函数的原理和运行机制,本文将给大家详细讲解递归函数的运行机制和运用。
那什么是递归函数呢?
递归函数即为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲解,还是很难明白。
好,那下面我们就用一个例子来给大家讲解。
大家首先思考一下,这个例子最终的输出结果是什么?
好,我们来看一下本函数输出的结果:
10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2 3 4 5 6 7 8 9 10
怎么样,不知道这个结果是否跟大家设想的一样呢?
好,下面我一步一步来给大家讲解...
第一步,执行test(10),echo 10,然后因为10>0,执行test(9),后面还有没来得及执行的echo 10
第二步,执行test(9),echo 9,然后因为9>0,执行test(8),同样后面还有没来得及执行的 echo 9
第三步,执行test(8),echo 8,然后因为8>0,执行test(7),同样后面还有没来得及执行的 echo 8
第四步,执行test(7),echo 7,然后因为7>0,执行test(6),同样后面还有没来得及执行的 echo 7
第五步,执行test(6),echo 6,然后因为6>0,执行test(5),同样后面还有没来得及执行的 echo 6
...........
第十步,执行test(0),echo 0,此时0>0的条件不满足,不在执行test()函数,而是echo “<-->”,并且执行后面的 echo 0
10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2 3 4 5 6 7 8 9 10
此时,输出的内容如上述显示的红色部分,此时函数已经不再调用自己,开始将流程的主控权交回给上一层函数来执行
也就是开始执行刚刚所有test()函数没来得及输出的最后一个echo
它的流程是这样子的:
在函数执行的第一到第十步,函数输出的的是绿色部分,红色部分还“没来及”输出,就该调用自己执行操作,依次类推,直到流程执行到不再满足调用自己的条件,输出“<-->”,此时,流程该执行前面“没来及”输出的代码。
就像我们平时玩的游戏一样,打死一个怪物,掉出一个宝贝,但是还有其他怪物在等着你来消灭,你不得不消灭完所有的怪物才能回来一个一个地拾宝贝。
怎么样,这么样跟大家来讲解是不是明白了呢?
有的同学又会问了,我在执行完所有的test函数之后,最终输出0
也就是输出到这里,
10 9 8 7 6 5 4 3 2 1 0 <--> 0
那为什么下一个输出的是 1 ,而不是 10 呢,
对于这个问题,为了帮助大家理解,下面我再给大家举一个例子:
看如下代码:
以上代码对test()函数进行分解操作,我们思考:
执行one(3)函数的时候,同test()函数一样,首先要输出3,然后调用two(2)函数,
注意,此时还没有输出下面的3,
接着走,执行two(2)函数,输出2,调用three(1)函数,同样,这里没有来得及输出下面的2,
执行three(1),直接输出1,不在调用其它函数,
此时,我们想刚刚的two()函数是不是还没有执行完,好,接着执行two()函数没有完成的部分,two()函数执行完之后,也就是输出下面的2,然后开始执行one()函数没有执行完的部分,也就是输出下面的3,此时所有函数执行完毕。
那么,输出结果是:
3 2 1 2 3
怎么样,大家这样理解起来是不是会容易些呢?
如果还是不太明白,请在下边跟帖提问,也请给出宝贵建议,我将会做出相应改进和讲解。