递归函数最直白的理解就是,函数内部自己调用自己。一码解千言,来一个很经典的例子:
function sum(array $num,$sum=0) { foreach($num as $item){ //遍历所有元素 if(is_array($item)){ //如果该元素是数组,调用本函数继续进行计算 return sum($item,$sum); }else{ $sum+=$item; } } return $sum; } //计算数组的所有元素的和 echo sum([1,2,3,[8,9]]); //23
是不是很简单,是不是很好用,如果不用递归函数的方法,要实现这个功能,得多写好多代码。
但递归函数需要注意的问题还是有的,我们从下面的例子来看递归函数的执行过程。
function recursion($num) { echo '开始:'.$num.'<br>'; if($num>0){ recursion($num-1); } echo '结束:'.$num.'<br>'; } //打印结果: /* 开始:3 开始:2 开始:1 开始:0 结束:0 结束:1 结束:2 结束:3 */
递归函数的执行顺序通常伴随着最外层的那件事儿没有完成的情况下,一层又一层的进入到另一件事儿当中,直到把最里层的那件事儿完成之后,才一层又一层的返回到最外层,完成最外层的程序!如上面的例子,执行的顺序为
//执行顺序 recursion(3); //$num=3 echo '开始:3'; if($num>0){ recursion(2); //3-1 echo '开始:2'; recursion(1); //2-1 echo '开始:1'; recursion(0); //1-1 echo '开始:0'; } if($num>0) //当参数$unm减为0时不成立,结束递归。 echo '结束:0'; //你是不是以为到这里就结束了。no no no! //函数调用的时候,每次调用时要做地址保存,参数传递等,本质上就是通过一个递归工作栈实现的 //在栈内存中的recursion(1);recursion(2);recursion(3);都还没执行结束,函数的执行的结束是到右大括号}或者遇到return才会结束,所以还会继续执行这几个函数的下部分。 recursion(1); echo '结束:1'; recursion(2); echo '结束:2'; recursion(3); echo '结束:3'; //到这里,递归函数才算完全退出。
总结理解就是:递归函数,从遇到递归开始(调用自身函数),每一层都独立存储在栈内存中,直到到达最内层的时候,也就是不再满足继续递归的条件的时候,开始从内到外的执行。
我画了一张图来进行详细的讲解:
所有的递归函数都可以这样进行分解来看。