今天一小伙伴写了一个递归,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);

三层四层以上就可以自己去想象了,不行就自己动手这样替换递归的函数会更好理解一些。


Donne
694 声望25 粉丝

知其然,知其所以然。