2011-01-26 13 views
0

結果としてINFを表示するコードに従います。何かアドバイス画面上に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); 
?> 
+4

fibonacciへの呼び出しで、400000より低い値を使用する... PHPで可能な限り高い浮動小数点数を超えているため、INFINITE –

+2

の結果が得られます。 bcmath関数を使用して –

+0

私はパズルを解こうとしているので、私は低い値を使うことはできません。ここではパズルです(値が400万を超えないフィボナッチシーケンスの項を考えれば、偶数の項の和を見つけることができます)。 – Kulbir

答えて

1

以下は、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)

EDIT

にはポイントがありません。単に、結果を得るそれが動作し、それが実際に何をどのように見て見て、それを実行するのではなく

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); 

:以下は、あなたが解決しようとしている問題(再使用bcmath)のために正しい結果を与える必要があります

+0

太陽が爆発する時間が短くても実行してください。 kthnxbye – mhughes

+0

@mhughes - 正しいロジックのためのEDITedコードはかなり素早く(私の上に0.0005秒の小さなdevボックス) –

+0

ありがとう – Kulbir

0

数が表示さには大きすぎる、INFはかなり良い推測です:)(フィボナッチ(1000)あなたは210桁の数を示します) 100:22桁、110:24桁、120 :25桁、130:27桁 これを外挿すると、約(400000/10)* 2 = 80000桁になります。

関連する問題