我只是在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
我有点困惑,希望有人能帮我理解这里发生了什么。
答案 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
打字错误。