2011-09-17 80 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