今天一小伙伴写了一个递归,echo可以输出要取的值,return的却总是null,写了一个简单的测试复原一下问题。
function test($i)
{
$i -= 4;
if ($i > 3) {
echo $i;
test($i);
}
echo $i;
return $i;
}
$a=test(30);
var_dump($a);
结果如下:
261014182226
int 26
代码思路看上去很简单,i>3就递归,不满足条件就返回i的值。问题就出在归的过程,最后return的值将会是第一次执行这个函数时(也就是最外层)的值30-4=26。
下面是修改后的递归函数:
function test($i)
{
$i -= 4;
if ($i > 3) {
return test($i);
}else{
return $i;
}
}
$a=test(30);
var_dump($a);
结果是
int 2
当不满足条件时,返回不满足条件的$i,然后这个这个$i将会是递归回去的唯一返回值。如果还是不太明白,下面就以一层递归解释其中到底发生了什么:
function test($i)
{
$i -= 4;
if ($i > 3) {
return test($i);
}else{
return $i;
}
}
$a=test(10);
上面的程序可以理解为:
function test(10)
{
$i -= 4;
if ($i > 3) {
//先执行里面的函数,接收到下面函数的返回值2 ,最终返回2
return
function test(6)
{
$i -= 4;
if ($i > 3) {
return test($i);
}else{
//此时$i是2,这个函数返回2到上一层函数
return $i;
}
}
$a=test(10);
}else{
return $i;
}
}
$a=test(10);
三层四层以上就可以自己去想象了,不行就自己动手这样替换递归的函数会更好理解一些。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。