Странные результаты Фибоначчи с использованием функции списка - PullRequest
1 голос
/ 18 января 2020

Я столкнулся с очень хорошей реализацией серии Фибоначчи, но у меня возникли проблемы с пониманием, как именно она работает. Вот две реализации, которые я попробовал, чтобы выяснить проблему:

<?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";
}
?>

Приведенные выше две функции дают следующие результаты соответственно: fibo: 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

Не могли бы вы объяснить, почему возникают разные результаты?

1 Ответ

1 голос
/ 18 января 2020

Повторение объяснения:

Это связано с тем, что $a теряет свое значение, когда оно установлено на значение $b во 2-й реализации. В 1-й реализации использование list() делает эти входные данные параметрами , и, таким образом, их значения не теряются при назначении. В этом случае для list () можно правильно использовать значение $a в назначении при определении $b.

Например:

</p> <pre><code>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);

Это исправляет 2-е внедрение.

С выводом:

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

...