2010-04-29 71 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