为什么这个PHP代码段会以这种方式运行?

时间:2011-09-17 15:37:47

标签: php recursion

我只是在PHP中进行一些递归练习,我对以下输出感到有点困惑:

function calc($numTimes, $i, $total) {
    if (!$i && !$total) {$i = 1; $total = 1;}
    if ($i <= $numTimes) {
        $total = $total*2;
        $i++;
        calc($numTimes, $i, $total);
    }
    echo $total.'+'.$i.'<br />';
}
calc(5);

在运行之前,我会假设输出 32 + 6 。但是,这就是我得到的:

32+6
32+6
16+5
8+4
4+3
2+2

我不明白。输出不仅比我预期的要长5行,而是增加总数,而不是从中删除?另外,如果我加一个休息时间;在回声之后,它只返回 32 + 6 ,这在某种程度上似乎是相关的。但是,当我更改代码以便它使用return $ total时;而不是回声:

function calc($numTimes, $i, $total) {
    if (!$i && !$total) {$i = 1; $total = 1;}
    if ($i <= $numTimes) {
        $total = $total*2;
        $i++;
        calc($numTimes, $i, $total);
    }
    return $total.'+'.$i.'<br />';
}
$r = calc(5);
echo $r;

这是打印出来的:

2+2

我有点困惑,希望有人能帮我理解这里发生了什么。

3 个答案:

答案 0 :(得分:4)

你没有对递归调用做任何事情。 这一行:

calc($numTimes, $i, $total);

可能会对值进行计算,但不会对其执行任何操作。请注意,永远不会保存返回的值。你必须得到它:

$res = calc($numTimes, $i, $total);

然后继续使用$ res

我认为你的意思是:

function calc($numTimes, $i = 0, $total = 0) {
    if (!$i && !$total) {$i = 1; $total = 1;}
    if ($i <= $numTimes) {
        $total = $total*2;
        $i++;
        return calc($numTimes, $i, $total);
    }
    return $total.'+'.$i.'<br />';
}
echo calc(5);

答案 1 :(得分:0)

在你的第一个例子中,calc()在内部被有条件地调用,因此它循环并输出大量结果(5次调用echo)。

在第二个示例中,您已将变量设置为calc()的返回值的结果。它仍然是循环的,但结果每次都被覆盖。所以你有一个结果显示(echo被调用一次)。

答案 2 :(得分:0)

您只是在第一个$sum子句中使用$total而不是if打字错误。