【问题标题】:Strange Fibonacci results using a list function使用列表函数的奇怪斐波那契结果
【发布时间】: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序列。第二个可能对列出二进制数的位值很有用。不包括零。

标签: php fibonacci


【解决方案1】:

解释重复:

这与$a 在第二次实现中设置为$b 的值时失去其值有关。在第一个实现中,list() 的使用使这些输入成为参数,因此在分配时它们的值不会丢失。在这种情况下,对于 list(),$a 的值可以在定义 $b 时正确用于赋值。

例如:

function fibo2($n){
    $a = 0;
    $b = 1;

    while($a<=$n){
        echo $a . " ";
        $save_a = $a;
        $a = $b;
        $b = $save_a + $b;
    }
    echo "\n";
}

fibo2(1000);

这更正了第二个实现。

输出为:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

【讨论】: