2010-04-29 25 views
2

我正在學習PHP。無法理解爲什麼這段代碼無法正常工作。在while循環中使用array_sum()

特別是:爲什麼array_sum($ x)(1596)的結果大於$ cap?也許我不瞭解while循環的本質,但在我看來(看一下print_r($ x)),循環應該在實際執行之前切出一個步驟。

<?php 

function fibonacci_sum($cap = 1000){ 

list($cur, $nxt, $seq) = array(0, 1, array()); 

while (array_sum($seq) < $cap) { 

$seq[] = $cur;  
$add = $cur + $nxt; 
$cur = $nxt; 
$nxt = $add; 
} 

return $seq; 

} 

$x = fibonacci_sum(); 
echo array_sum($x); 

?> 

任何洞察力的讚賞。

最佳, 亞光

回答

0

的總和小於cap進入while循環體的最後一次。這就是循環在所有主要語言中的工作方式。在這種情況下,當循環最後一次退出時,總和大於cap

2

這樣看:如果array_sum($x)小於$cap,那麼while循環的主體將被再次執行。因此,當while循環停止執行時,根據定義,while頂部的條件將爲false。 (*)我想你想說:你超過$cap

while (array_sum($seq) + $cur < $cap) { 

這將停止只是之前這是你似乎什麼想做的事情。

(*)是的,是的,關於break聲明的影響的免責聲明。

+0

謝謝你,丹尼爾。 – m477 2010-04-29 16:59:31

2

簡單的執行順序。

如果加少許變量觀察者很容易看到這是如何發生的

while (array_sum($seq) < $cap) 
    { 
    echo $cur, ' : ', array_sum($seq), '<br>'; 
    $seq[] = $cur; 
    $add = $cur + $nxt; 
    $cur = $nxt; 
    $nxt = $add; 
    } 

如果你運行它,最後輸出顯示610 : 986。因此,986小於1000,這就是循環執行的原因,但循環的第一行無論如何推動$cur$seq - 完全沒有意識到它只是使創造者勝過帽子。所以,當你做array_sum()的功能外,該610是它的一部分,因此,1596年

所以,你真正想要的是當數組和加上下一個值小於上限。

while (array_sum($seq) + $cur < $cap) 

但是,你的函數完全返回一個數組有點奇怪。爲什麼不直接讓它直接返回?

+0

感謝彼得,這非常有道理。欣賞清晰度。你說得對,最後函數應該返回總和。 – m477 2010-04-29 16:56:33