Maison  >  Article  >  développement back-end  >  递归是否隐藏着循环

递归是否隐藏着循环

WBOY
WBOYoriginal
2016-06-23 13:33:07887parcourir

先看代码

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

上例中,我认为理解是有循环的意思,比如当代进去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
传入 abcdefg传入 bcdefg传入 cdefg传入 defg传入 efg传入 fg传入 g传入 返回时 gg返回时 fgf返回时 efge返回时 defgd返回时 cdefgc返回时 bcdefgb返回时 abcdefga

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

上面的循环是这样的
当代进实参后,因为大于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
传入 abcdefg传入 bcdefg传入 cdefg传入 defg传入 efg传入 fg传入 g传入 返回时 gg返回时 fgf返回时 efge返回时 defgd返回时 cdefgc返回时 bcdefgb返回时 abcdefga

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



嗯,豁然开朗!

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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn