【问题标题】:Get Fibonacci number By Index - PHP按索引获取斐波那契数 - PHP
【发布时间】:2021-03-08 09:22:20
【问题描述】:

我有一个简单的 PHP 函数,它按索引返回斐波那契数,它可以工作:

function fibIndexCalculator($index)
{
    $numbers = [0, 1];
    for ($i = 0; $i < $index; $i++) {
        $lastNumbers = array_slice($numbers, count($numbers) - 2, 2);
        $numbers[] = $lastNumbers[0] + $lastNumbers[1];
    }
    return end($numbers);
}
var_dump(fibIndexCalculator(4));

但是如果我给函数一个像 200000 这样的索引,那么只有在 1 小时后我才能看到结果。

有没有什么方法可以改变算法以快速获取大索引的斐波那契数?

【问题讨论】:

标签: php algorithm fibonacci


【解决方案1】:

如果我给函数一个像 200000 这样的索引,那么只有在 1 小时后我才能看到结果。

如果您这样做,您将看不到任何有用的结果。输出将是 INF。这是因为 PHP 使用的 64 位浮点有一个可以表示的最大值,它接近 1.797E+308。索引为 1475 的斐波那契数已经在 1E+308 左右...

但在浮点数的限制下,可以直接使用下面的公式:

function fibIndexCalculator($index) {
    $SQRT5 = sqrt(5);
    return round(((1 + $SQRT5) / 2)**$index / $SQRT5);
}

如果您想坚持迭代解决方案,请注意您如何累积一个数组,您再也不会使用该数组中的旧值 - 只使用最后两个值。所以不要保留一个数组,而只保留两个变量:

function fibIndexCalculator2($index) {
    if ($index < 2) return $index;
    $b = 1;
    $c = 1;
    while ($index > 2) {
        $a = $b;
        $b = $c;
        $c = $a + $b;
        $index--;
    }
    return $c;
}

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 2013-03-14
    • 2011-11-27
    • 1970-01-01
    • 2015-06-05
    • 2014-05-23
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多