在while循环中使用array_sum()

时间:2010-04-29 16:38:44

标签: php while-loop

我正在学习PHP。无法理解为什么这段代码不起作用。

特别是:为什么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);

?>

任何见解都表示赞赏。

最佳, 亚光

3 个答案:

答案 0 :(得分:2)

以这种方式看待:如果array_sum($x)小于$cap,那么while循环的主体将再次执行。因此,当while循环停止执行时,根据定义,while顶部的条件将为false。 (*)我想你想说:

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

这将在之前停止超过$cap,这是您似乎想要做的事情。

(*)是的,是的,关于break陈述效果的免责声明。

答案 1 :(得分: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 )

但是,你的函数返回一个数组有点奇怪。为什么不让它直接返还总和呢?

答案 2 :(得分:0)

总和小于上次输入while循环体时的cap。这就是while循环在所有主要语言中的工作方式。在这种情况下,当最后一次退出循环时,总和大于cap