以下代码在屏幕上显示INF值

时间:2011-01-26 11:15:51

标签: php

以下代码显示INF作为结果。任何建议

<?php
function fibonacci($n)
{
$a = 1; $b = 1; $result = 0;
for ($i = 0; $i < $n; $i=$i+1)
{
    $sum = $a+$b;
    $a = $b;
    $b = $sum;
    if ($a %2 == 0)
    {   

        $result = $result + $a;
    }
}
echo "<br/>".$result;
}
echo fibonacci(400000);
?>

2 个答案:

答案 0 :(得分:0)

数字太大而无法显示,INF是一个非常好的猜测:)(斐波那契(1000)给你一个210位的数字) 100:22位,110:24位,120:25位,130:27位 如果你推断出来,你最终会得到大约(400000/10)* 2 = 80000位。

答案 1 :(得分:0)

以下使用bcmath实现您的逻辑以防止INF错误。

function fibonacci($n)
{
    $a = '1'; $b = '1'; $result = '0';
    for ($i = 0; $i < $n; $i++) {
        $sum = bcadd($a,$b);
        $a = $b;
        $b = $sum;
        if (bcmod($a,'2') == '0') {
            $result = bcadd($result,$a);
        }
    }
    echo "<br />".$result;
}

由于你的斐波纳契函数实际上没有返回任何值,所以回波斐波那契(400000)没有任何意义

修改

但是,你的逻辑是完全有缺陷的。以下内容应该为您尝试解决的问题提供正确的结果(再次使用bcmath):

function fibonacci($n)
{
    $a = '0'; $b = '1'; $sum = '0';
    $sum = '0';
    do {
        $fib = bcadd($a,$b);
        $a = $b;
        $b = $fib;
        if (bccomp($fib,$n) == -1) {
            if (bcmod($fib,'2') == '0') {
                $sum = bcadd($sum,$fib);
            }
        }
        ++$i;
    } while (bccomp($fib,$n) == -1);
    return $sum;
}


echo fibonacci(4000000);

不是简单地执行它来获得结果,而是看看它是如何工作的以及它实际上在做什么