php自定义函数之递归函数

递归函数,递归只是一个名字,而递归函数的规定:函数体内调用函数自己。

这需要一定的思维理解深度,本章学习过程当中,如果你实在是有思维无法跟上的地方,可以跳过本章不用学习。

因为,实际工作中,用递归有用到,但是使用量不会很大。递归在实际工作中主要是用在:文件和文件夹操作的时候有使用到。

解决办法:
万一你的思维跟不上本章,你可以直接了解本块的原理后,用现成的文件和文件夹处理函数或文件处理类就可以。

我说几个思维上的盲区:

    1.代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。

    2.如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。

    3.递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。

我们来写一代码码来理解一下:

<?php

$num = 10;


//调用一次函数A();
A($num);



function A( $arg ){

   echo $arg;

   //在函数A里面去,跑去执行函数B去了
   B($arg);


   echo '我们需要不断的努力,努力到上天都为我们感动';


   echo $arg.'<br />';
}

function B( $number ){

       echo $number;


       echo '俺是狗蛋,执行完了<br />';

}


?>

通过上例大家会发现:

    1.执行函数A到一半的时候,跑去执行了函数B

    2.执行完函数B,先显示出来的是:“俺是狗蛋,执行完了”,接着显示的才是:“我们需要不断的努力,努力到上天都为我们感动”

    3.也就是证明了我们所说思维盲区里面的内容,代码从上到下执行,代码必须执行完。

    我们来写一个简单的递归代码,让函数自己调用自己。

<?php

$n = 2;

function dg( $n ){

   echo $n.'<br />';

   $n = $n - 1;

   if($n > 0){
       //在函数体内调用了dg自己哟
       dg($n);

   }else{

       echo '--------------';
   }

   echo '俺是狗蛋,俺还没执行' . $n . '<br />';

}
?>

你猜猜显示结果是什么?为什么这样?

我们来仔细推理一次:

    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点中的余下代码执行完。


继续学习
||
<?php $n = 2; function dg( $n ){ echo $n.'<br />'; $n = $n - 1; if($n > 0){ //在函数体内调用了dg自己哟 dg($n); }else{ echo '--------------'; } echo '俺是狗蛋,俺还没执行' . $n . '<br />'; } ?>
提交重置代码
章节
笔记
提问
课件
反馈
捐赠

php入门教程之一周学会PHP

高并发千万级数据库系统解决方案
  • 推荐课程
  • 评论
  • 问答
  • 笔记
  • 课件下载
sssfc

sssfc

因为代码里没有调用DG();肯定是故意的,哈哈

4年前    添加回复 2

Dante

我也觉得是故意的

Dante · 2019-02-15 10:22
回复
meleeZhao

meleeZhao

<?php function a($n){ if($n==1){ return 1; }else{ return $n+a($n-1); } } echo a(100); ?>

4年前    添加回复 1

回复
移动用户-5695325

移动用户-5695325

还是不理解这后面狗蛋为啥执行那么多遍 还以为是只执行一遍

1年前    添加回复 0

回复
visual

visual

<?php $n = 2; function dg( $n ){ echo $n.'<br />'; $n = $n - 1; if($n > 0){ //在函数体内调用了dg自己哟 dg($n); }else{ echo '--------------'; } echo '俺是狗

2年前    添加回复 0

回复
旧歌

旧歌

方法声明以后都没调用,怎么运行代码。。。。。

3年前    添加回复 0

回复
vec

vec

<?php $n = 2; function dg( $n ){ echo $n.'<br />'; $n = $n - 1; if($n > 0){ //在函数体内调用了dg自己哟 dg($n); }else{ echo '--------------'; } echo '俺是狗

3年前    添加回复 0

回复
vec

vec

<?php $n = 2; function dg( $n ){ echo $n.'<br />'; $n = $n - 1; if($n > 0){ //在函数体内调用了dg自己哟 dg($n); }else{ echo '--------------'; } echo '俺是狗

3年前    添加回复 0

回复
JasperD

JasperD

这课程能好好看吗,感觉很误导同学啊

3年前    添加回复 0

回复
青风百里

青风百里

<?php function ap($i = 1,$a = ['1' => 1]){ $a[$i+1] = 2*$a[$i] + 3; $i++; if ($i<10) { ap($i,$a); } var_dump($a); } $res = ap(); ?>

4年前    添加回复 0

回复
青风百里

青风百里

<?php function ap($i = 1,$a = ['1' => 1]){//定义初始值,$a[1]为1,相当于数列a(n)首相为1;$i仅仅用于循环控制 $a[$i+1] = 2*$a[$i] + 3;//设置递推公式,该递推公式为a(n+1)=2*a(n)+3,在高中数学中,这是一个常见的数列递推公式 $i++; if ($i<10) {//递归函数,

4年前    添加回复 0

回复
青风百里

青风百里

<?php function ap($i = 1,$a = ['1' => 1]){//定义初始值,$a[1]为1,相当于数列a(n)首相为1;$i仅仅用于循环控制 $a[$i+1] = 2*$a[$i] + 3;//设置递推公式,该递推公式为a(n+1)=2*a(n)+3,在高中数学中,这是一个常见的数列递推公式 $i++; if ($i<10) {//递归函数,

4年前    添加回复 0

回复
ID是两颗心去旅行

ID是两颗心去旅行

评论区是学习的第二课堂啊。

4年前    添加回复 0

回复
luoshui

luoshui

最后的代码有问题啊。

4年前    添加回复 0

回复
我只是一条咸鱼哈

我只是一条咸鱼哈

代码有问题,希望能完善ε=(´ο`*)))唉

4年前    添加回复 0

回复
我只是一条咸鱼哈

我只是一条咸鱼哈

o(* ̄︶ ̄*)o

4年前    添加回复 0

回复

执行没有任何结果出来

[最新 希恩 的回答]

时间:3年前

为何最后还会执行4行

[最新 仰望空调的兔子 的回答]第四次执行dg()执行完成。第三次dg()的代码还没执行完,。就返回上一次执行.也就是接着第三次

时间:3年前

为啥第二个执行不出来???

[最新 益伦 的回答]没有调用函数,后面加个dg($n);就可以

时间:5年前

php递归函数怎么理解?

[最新 益伦 的回答]写得很详细了,虽然我还不会写,但是逻辑基本搞清楚了

时间:5年前

浮世绘梦

浮世绘梦

递归函数,递归只是一个名字,而递归函数的规定:函数体内调用函数自己。

1年前 0

秋城

秋城

递归函数的规定:函数体内调用函数自己。

2年前 0

YuShine Wei

YuShine Wei

递归函数,递归只是一个名字,而递归函数的规定:函数体内调用函数自己。 几个思维上的盲区: 1.代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。 2.如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。 3.递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。

2年前 0

吒哪

吒哪

递归在实际工作中主要是用在:文件和文件夹操作的时候有使用到。

2年前 0

Robinson_Wang

Robinson_Wang

结果和教材对不上

3年前 1

久作不死。

久作不死。

第二次执行dg()执行完成。第一次dg()的代码还没执行完,将第4点中的余下代码执行完。 里面的循环走完了,外面的循环才继续走

3年前 0

博龙

博龙

<?php $flag = 5; function fn($flag){ echo $flag.'<br>'; $flag--; if($flag>0){ fn($flag); }else{ echo 'fn函数执行完毕'; } } fn($flag); ?> 几个思维上的盲区: 1.代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。 2.如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。 3.递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。

4年前 0

夜星辰

夜星辰

几个思维上的盲区: 1.代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。 2.如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。 3.递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。

4年前 0

phpcn_u722

phpcn_u722

<?php $flag = 5; function fn($flag){ echo $flag.'<br>'; $flag--; if($flag>0){ fn($flag); }else{ echo 'fn函数执行完毕'; } } fn($flag); ?>

5年前 0

课件暂不提供下载,工作人员正在整理中,后期请多关注该课程~