通过索引获取斐波那契数-PHP

通过索引获取斐波那契数-PHP,php,algorithm,fibonacci,Php,Algorithm,Fibonacci,我有一个简单的PHP函数,它通过索引返回斐波那契数,它可以工作: function fibIndexCalculator($index) { $numbers = [0, 1]; for ($i = 0; $i < $index; $i++) { $lastNumbers = array_slice($numbers, count($numbers) - 2, 2); $numbers[] = $lastNumbers[0] + $lastN

我有一个简单的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));
函数fibinexcalculator($index)
{
$numbers=[0,1];
对于($i=0;$i<$index;$i++){
$lastNumbers=array_slice($numbers,count($numbers)-2,2);
$numbers[]=$lastNumbers[0]+$lastNumbers[1];
}
返回端(数字);
}
变量转储(fibinexcalculator(4));
但是如果我给函数一个像200000这样的索引,那么只有在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;
}
函数fibinexcalculator 2($index){
如果($index<2),返回$index;
$b=1;
$c=1;
而($index>2){
$a=$b;
$b=$c;
$c=$a+$b;
$index--;
}
返回$c;
}

您可以编写公式来计算数字,而不是循环