先看代码
function reverse($str){ if(strlen($str)>0){ reverse(substr($str,1)); echo substr($str,0,1); return; }}reverse("abcdefg");//gfedcbc
递归就是一种循环
递归代码都可以化为循环代码
递归代码与循环代码的不同之处在于:
递归使用了系统的堆栈保存中间结果
循环使用了一个自己维护的数据结构了保存中间结果
所以,递归代码比循环代码简洁的多
有人说递归效率低,那是他无知了
但是并非所有的循环都可以用递归实现
请教下不带返回值的作用是什么呢?
试试static
递归就是一种循环
递归代码都可以化为循环代码
递归代码与循环代码的不同之处在于:
递归使用了系统的堆栈保存中间结果
循环使用了一个自己维护的数据结构了保存中间结果
所以,递归代码比循环代码简洁的多
有人说递归效率低,那是他无知了
但是并非所有的循环都可以用递归实现
递归就是一种循环
递归代码都可以化为循环代码
递归代码与循环代码的不同之处在于:
递归使用了系统的堆栈保存中间结果
循环使用了一个自己维护的数据结构了保存中间结果
所以,递归代码比循环代码简洁的多
有人说递归效率低,那是他无知了
但是并非所有的循环都可以用递归实现
我有点明白了,其实很多函数中都暗含着重新赋值的规则,
比如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也同步时行输出,所以这就是递归的用法
估计这是全网唯一这么深入剖析递归的例子