以下代码显示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);
?>
答案 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);
不是简单地执行它来获得结果,而是看看它是如何工作的以及它实际上在做什么