2011-09-17 47 views
1

我只是做了一些用PHP递归练习和我有点通过以下的输出困惑:为什么这个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

'$ sum'是什么?你想做什么?如果你的代码被破坏了,我该如何解决? –

回答

4

你没有做任何递归调用。 行:

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

可能calculcate的值,但确实与它无关。请注意,返回值从不保存。你必须把它拿来:

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

,然后跟上$资源去

我想你的意思是:

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); 
+0

@dfsq updated;) – galchen

+0

这个工作原理并且只返回我感兴趣的值。我很想知道为什么总数一直在减少。感谢您提供有关定义默认值的提示:) – Freyr

+0

当您将$ total发送到呼叫时,您不会发送变量,而是发送变量的值。您对$ total所做的任何更改都不会影响外部范围。每次递归调用都会创建一个新的“$ total” – galchen

0

在你的第一个例子,calc()被称为内部自身条件,因此它循环并输出许多结果(5次调用echo)。

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

0

你只是有一个错字,在第一个if子句中使用$sum而不是$total