Rumah > pembangunan bahagian belakang > tutorial php > 递归是否隐藏着循环

递归是否隐藏着循环

WBOY
Lepaskan: 2016-06-23 13:33:07
asal
930 orang telah melayarinya

先看代码

function reverse($str){  if(strlen($str)>0){    reverse(substr($str,1));    echo substr($str,0,1);    return;  }}reverse("abcdefg");//gfedcbc
Salin selepas log masuk

上例中,我认为理解是有循环的意思,比如当代进去abcdefg这个实参后,reverse函数首先计算是否等于0,如果等就算了,如果大就开始,此处7位数大于0,所以首先输入啥呢,不对,还是有点晕,这个如何理解呢,乱七八糟的,在逻辑上实在是不可思议


回复讨论(解决方案)

递归就是一种循环
递归代码都可以化为循环代码
递归代码与循环代码的不同之处在于:
递归使用了系统的堆栈保存中间结果
循环使用了一个自己维护的数据结构了保存中间结果

所以,递归代码比循环代码简洁的多
有人说递归效率低,那是他无知了

但是并非所有的循环都可以用递归实现

请教下不带返回值的作用是什么呢?
试试static

递归就是一种循环
递归代码都可以化为循环代码
递归代码与循环代码的不同之处在于:
递归使用了系统的堆栈保存中间结果
循环使用了一个自己维护的数据结构了保存中间结果

所以,递归代码比循环代码简洁的多
有人说递归效率低,那是他无知了

但是并非所有的循环都可以用递归实现



你说的是理论,我们现在玩真的:

对于这个实例,我的理解是这样的:你看哪里理解有误哈!!!!!!

首先 参数abcdefg,是七位,所以程序一看大于0,就直接进入echo substr(abcdefg0,1);中计算,所以返回的是a,到此,程序结束

递归就是一种循环
递归代码都可以化为循环代码
递归代码与循环代码的不同之处在于:
递归使用了系统的堆栈保存中间结果
循环使用了一个自己维护的数据结构了保存中间结果

所以,递归代码比循环代码简洁的多
有人说递归效率低,那是他无知了

但是并非所有的循环都可以用递归实现


二楼也是我正想问的,一块再细说说吧。
这个函数中的关键我认为是return;
不过疑问来了,这里的返回是谁呢:是反回的 reverse(substr($str,1));还是反回的 echo substr($str,0,1);
我认为是前者,假如 是前者,那么问题又来了,比如反回了bcdefg它,此时程序就不会再往下进行了,为啥还能循环呢,道理何在?
还有一个问题让人苦恼,echo的时候,首先出来的是a哈,咋从后面出来的呢

我有点明白了,其实很多函数中都暗含着重新赋值的规则,
比如substr($str,0,1);
其实此时暗藏着经过计算
$str由原来的abcdefg重新赋值为bcdefg
这也是很多初学者一直解不开的死结,有时靠灵感突然明白了。不过这里很少有教程为讲的,他们只是一味的说循环啊循环,里面的道理其实我认为他们也是搞不明白,再深入一步的感悟是,学习编程真要好好的理解堆和栈以及变量的原理,这为理解很多潜规则做好条件。

动手,是学习计算机技术的首要条件
你把函数改一下

function reverse($str){  echo "传入 $str\n"; //这里  if(strlen($str)>0){    reverse(substr($str,1));    echo "\n返回时 $str\n";; //这里    echo substr($str,0,1);    return;  }}reverse("abcdefg");//gfedcbc
Salin selepas log masuk
Salin selepas log masuk
传入 abcdefg传入 bcdefg传入 cdefg传入 defg传入 efg传入 fg传入 g传入 返回时 gg返回时 fgf返回时 efge返回时 defgd返回时 cdefgc返回时 bcdefgb返回时 abcdefga
Salin selepas log masuk
Salin selepas log masuk

一目了然!
这是你冥思苦想几天几夜都不能理解的

上面的循环是这样的
当代进实参后,因为大于0,所以reverse(substr($str,1));
然后return返回它reverse(substr($str,1));
同时输出echo substr($str,0,1);它


动手,是学习计算机技术的首要条件
你把函数改一下

function reverse($str){  echo "传入 $str\n"; //这里  if(strlen($str)>0){    reverse(substr($str,1));    echo "\n返回时 $str\n";; //这里    echo substr($str,0,1);    return;  }}reverse("abcdefg");//gfedcbc
Salin selepas log masuk
Salin selepas log masuk
传入 abcdefg传入 bcdefg传入 cdefg传入 defg传入 efg传入 fg传入 g传入 返回时 gg返回时 fgf返回时 efge返回时 defgd返回时 cdefgc返回时 bcdefgb返回时 abcdefga
Salin selepas log masuk
Salin selepas log masuk

一目了然!
这是你冥思苦想几天几夜都不能理解的



嗯,豁然开朗!

其实这里是这样的,
先分两步走,一步是反回字符串,一步是打印出字符串
第一步:reverse(substr($str,1));以abcde为例,第一次的时候abcde代入函数中reverse(substr($str,1));,那么肯定是bcde了,然后它由return返回到内存中,接着reverse函数又接手新的变量值,即bcde后,再用reverse(substr($str,1));计算,又得到了cde
以此类推!
而同时第二步的echo也同步时行输出,所以这就是递归的用法
估计这是全网唯一这么深入剖析递归的例子

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan