我正在学习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);
?>
任何见解都表示赞赏。
最佳, 亚光
答案 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
。