5.2.7 递归函数
最后更新于:2022-04-02 00:19:33
递归函数,递归只是一个名字,而递归函数的规定:函数体内调用函数自己。
这需要一定的思维理解深度,本章学习过程当中,如果你实在是有思维无法跟上的地方,可以跳过本章不用学习。
因为,实际工作中,用递归有用到,但是使用量不会很大。递归在实际工作中主要是用在:文件和文件夹操作的时候有使用到。
解决办法:
万一你的思维跟不上本章,你可以直接了解本块的原理后,用现成的文件和文件夹处理函数或文件处理类就可以。
我说几个思维上的盲区:
1. 代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。
2. 如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。
3. 递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。
我们来写一代码码来理解一下:
~~~
';
}
function B( $number ){
echo $number;
echo '俺是狗蛋,执行完了
'; } ?> ~~~ 通过上例大家会发现: 1. 执行函数A到一半的时候,跑去执行了函数B 2. 执行完函数B,先显示出来的是:“俺是狗蛋,执行完了”,接着显示的才是:“我们需要不断的努力,努力到上天都为我们感动” 3. 也就是证明了我们所说思维盲区里面的内容,代码从上到下执行,代码必须执行完。 我们来写一个简单的递归代码,让函数自己调用自己。 ~~~ '; $n = $n - 1; if($n > 0){ //在函数体内调用了dg自己哟 dg($n); }else{ echo '--------------'; } echo '俺是狗蛋,俺还没执行' . $n . '
'; } dg($n); ?> ~~~ 你猜猜显示结果是什么?为什么这样? 我们来仔细推理一次: 1. 第一次调用dg(),将数字$n = 2传到dg中,先显示出来了2 2. 然后将$n - 1 $n的值为了1 3. 接着判断$n 是否大于0,肯定是大于0的,所以调用递归自己,再把自己执行一次。 4. 而第二次在执行自己dg()的时候,而最下面的 **echo '俺是狗蛋,俺还没执行' . $n . '
';** 还没有执行到。等待执行完成后再来执行 5. $n此时等于1 ,所以显示出来1。 6. $n把自己减了一次,$n的结果为0 7. $n大于0肯定不成立的,所以显示了一条:"--------------" 8. 而这个时候该执行:echo '俺是狗蛋,俺还没执行' . $n . '
'; 9. 第二次执行dg()执行完成。第一次dg()的代码还没执行完,将第4点中的余下代码执行完。 上面的,我们就将运行结果推导完了,我们接下来,看看效果: ![document/2015-08-16/55d03fa56b605](http://box.kancloud.cn/document_2015-08-16_55d03fa56b605.png)
';
'; } ?> ~~~ 通过上例大家会发现: 1. 执行函数A到一半的时候,跑去执行了函数B 2. 执行完函数B,先显示出来的是:“俺是狗蛋,执行完了”,接着显示的才是:“我们需要不断的努力,努力到上天都为我们感动” 3. 也就是证明了我们所说思维盲区里面的内容,代码从上到下执行,代码必须执行完。 我们来写一个简单的递归代码,让函数自己调用自己。 ~~~ '; $n = $n - 1; if($n > 0){ //在函数体内调用了dg自己哟 dg($n); }else{ echo '--------------'; } echo '俺是狗蛋,俺还没执行' . $n . '
'; } dg($n); ?> ~~~ 你猜猜显示结果是什么?为什么这样? 我们来仔细推理一次: 1. 第一次调用dg(),将数字$n = 2传到dg中,先显示出来了2 2. 然后将$n - 1 $n的值为了1 3. 接着判断$n 是否大于0,肯定是大于0的,所以调用递归自己,再把自己执行一次。 4. 而第二次在执行自己dg()的时候,而最下面的 **echo '俺是狗蛋,俺还没执行' . $n . '
';** 还没有执行到。等待执行完成后再来执行 5. $n此时等于1 ,所以显示出来1。 6. $n把自己减了一次,$n的结果为0 7. $n大于0肯定不成立的,所以显示了一条:"--------------" 8. 而这个时候该执行:echo '俺是狗蛋,俺还没执行' . $n . '
'; 9. 第二次执行dg()执行完成。第一次dg()的代码还没执行完,将第4点中的余下代码执行完。 上面的,我们就将运行结果推导完了,我们接下来,看看效果: ![document/2015-08-16/55d03fa56b605](http://box.kancloud.cn/document_2015-08-16_55d03fa56b605.png)