【发布时间】:2026-02-18 16:10:01
【问题描述】:
我遇到了一个非常好的斐波那契数列实现,但我无法理解它是如何工作的。以下是我尝试解决问题的两种实现方式:
<?php
fibo(1000);
fibo2(1000);
function fibo($n){
list($a, $b) = [0, 1];
while($a<=$n){
echo $a . " ";
list($a, $b) = [$b, $a + $b];
}
echo "\n";
}
function fibo2($n){
$a = 0;
$b = 1;
while($a<=$n){
echo $a . " ";
$a = $b;
$b = $a + $b;
}
echo "\n";
}
?>
以上两个函数分别产生如下结果: 斐波那契:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 fibo2:0 1 2 4 8 16 32 64 128 256 512
您能解释一下为什么会出现不同的结果吗?
【问题讨论】:
-
你已经注意到了一些“奇怪”的东西。第二个是不是斐波那契数列。只是简单的 ole 加倍。
-
@GetSet 如果您在第二个中添加数字,您将看到斐波那契数列出现。问题是我不明白为什么。为什么第一个有效而第二个无效?这是否与变量的可变性/不变性有关?
-
这与
$a在第二次实现中设置为$b的值时失去其值有关。在第一个实现中,list()的使用使这些输入成为参数,因此在分配时它们的值不会丢失。在这种情况下,$a的值可以在定义$b时正确的用于赋值。 -
感谢@GetSet!这样就搞定了。
-
是的,第二个不是fib序列。第二个可能对列出二进制数的位值很有用。不包括零。