web-dev-qa-db-ja.com

PHPフィボナッチ数列

このphpメソッドは、forループを使用して、指定された値までのフィボナッチ数列を出力することを想定しています。なぜ機能しないのかわかりません。

<?php
function fib ($n) { // a function called fib, declaire variable n (the sequence number)
    for ($n=0;$n<30;$n++) {
        if ($n < 3) { return $n; } // if n is smaller than 3 return n (1 or 2)
        else { return fib ($n - 1) + fib ($n - 2); } 
    /* if the number is 3 or above do 2 sums (n-1) and (n-2)
    and then add the 2 sums together (n-1)+(n-2)
    Example Fibonacci number 4
    (4-1)+(4-2) = 5
    3 + 2 = 5
    */
}
print $n;
?>
8

丸めを使用して反復なしでフィボナッチ数を計算する方法は実際にあります。

http://en.wikipedia.org/wiki/Fibonacci_number#Computation_by_rounding

function getFib($n)
{
    return round(pow((sqrt(5)+1)/2, $n) / sqrt(5));
}
36
Lee Davis

フィボナッチの簡単な機能

function fibonacci($n,$first = 0,$second = 1)
{
    $fib = [$first,$second];
    for($i=1;$i<$n;$i++)
    {
        $fib[] = $fib[$i]+$fib[$i-1];
    }
    return $fib;
}
echo "<pre>";
print_r(fibonacci(50));
7
user2669208

この例では、forループを使用して、長さを10に制限しています。

$x = 0;    
$y = 1; 

for($i=0;$i<=10;$i++)    
{    
    $z = $x + $y;    
    echo $z."<br />";         
    $x=$y;       
    $y=$z;     
}   

出力:
1
2
3
5
8
13
21
34
55
89
144

6

あなたには2つの解決策があります

function fib($n) { $fib_array = [0, 1]; for ($i = 2; $i < $n; $i++) { $fib_array[$i] = $fib_array[$i - 1] + $fib_array[$i - 2]; } return $fib_array; } print_r(fib(6));

再帰関数

function rec_fib($x) {
    if ($n < 2) {
        return $n;
    }
    return fib($n - 1) + fib($n - 2);
}

print_r(rec_fib(6));

言語がどのように機能するかについてのあなたの基本的な理解は間違っているようです。関数を定義していますが、それを呼び出すことはありません。あなたはすぐに上書きするパラメーターを与えています。

これを試して:

$fib = [1,0];
for($i=0; $i<30; $i++) {
    $next = array_sum($fib);
    array_shift($fib);
    array_Push($fib,$next);
    echo $next.", ";
}
3

私は1年遅れていることを知っていますが、これが私の貢献です。 2つの可能な解決策があります。

function fib1($n)
{
    return $n < 3 ? 1 : fib1($n - 1) + fib1($n - 2);
}
function fib2($n, $c = 2, $n2 = 0, $n1 = 1)
{
    return $c < $n ? fib2($n, $c + 1, $n1, $n1 + $n2) : $n1 + $n2;
}

最初のものはよりエレガントで、数学的に定義されているのと同じ方法で結果を計算します。問題は、大きな$ nにとって非常に高価なことです。

2番目の方がはるかに高速ですが、ユーザーが最初のパラメーターのみを設定することを確認する必要があります。

実行時間:

$ n = 20、fib1 = 0.092s、fib2 = 0.001s

$ n = 30、fib1 = 12.2827s、fib2 = 0.001s

$ n = 40、fib1 => 500秒fib2 = 0.001秒

2
Petr

$nをループカウンターにすると、関数の引数として取得した$nが上書きされます。

forステートメントを削除し、本文のみを残します。

2
Oswald

フィボナッチシリーズは次のようになります。

0、1、1、2、3、5、8、13、21、34、

function fabnacaiiSeries($num){
    $first=0;$second=1;
    for($i=0;$i<$num;$i++){
        if($i<=1){
            $next=$i;
        }  else  {
            $next=$first+$second;
            $first=$second;
            $second=$next;
        }

        echo  $next." , ";
    }   
}

fabnacaiiSeries(10);

詳細を表示

1
shishir mishra
function fib($m){
    $j=0;$k=1;
    for($i=0;$i<=$m;$i++){
          $l=$k;
          $k=$j+$k;
          $j=$l;
      }
   return $k;
}
1
Josh Woodcock

これは非効率的なfib($ n-1)+ fib($ n-2)です。これが再帰ありとなしの私の解決策です。 $ fib [1..N] = []のような累積辞書を使用していませんが、ステップ合計を計算して次の反復または再帰呼び出しに渡します。

// with recursion 
function fib($n, $a = 0, $b = 1) {
    if ($n < 1) {
        return $a;
    }        

    return fib($n - 1, $b, $a + $b);
}


// with simple loop
function fib($N) {
    $a = 0;
    $b = 1;
    for ($i = 0; $i < $N; $i++) {
        $t = $a + $b;
        $a = $b;
        $b = $t;
    }
    return $a;
}
1
radzserg

これは私が使用する方法です:

function fibonacci_series($n) {
  $f1 = -1;
  $f2 = 1;

  for ($i = 1; $i <= $n; $i++) {
    $f = $f1 + $f2;
    $f1 = $f2;
    $f2 = $f;
    echo "$f<br />"; 
  }
 }

echo fibonacci_series(5);

説明については こちら をご覧ください

1
Guru
    function fibonacci( $n ) {
if (( $n == 0 ) || ( $n == 1 )) {
     return $n;
}
return fibonacci( $n-2 ) + fibonacci( $n-1 );}
1
El Niño
function getFib($n, $nN, $ct = 0, $max = 100)
 {
     $ct++;
     echo "$nN \n";
     ($ct < $max) ? getFib($nN, $n+$nN, $ct) : die();

 }

 echo 0;
 getFib(0, 1);

再帰的なFib

1
François P.

先日のインタビューでフィボナッチ関数を書くように言われました。再帰について考えましたが、当時は非効率だと思いました。

私は次のように私のものを書いてしまいました:

function fib ($num) {
    $count = 0;
    $current = 0;
    $one_back = 0;
    $two_back = 0;

    while ($count <= $num) {    
        $current = $one_back + $two_back;
        $two_back = $two_back ? $one_back : 1;
        $one_back = $current;
        $count++;
    }

    return $current;
}

彼らは最終的な回答しか望んでいませんでしたが、明らかにすべての反復を配列にプッシュするように簡単に変更できました。

後で、私は再帰バージョンに対して私をテストしました...私はより高速です。

$ numが> 1476の場合はINFを返すので、phpの最大整数値に到達すると思います。

楽しみのために、1476を再帰的なフィボナッチ関数に渡し、コンピューターが溶けるのを見てください:-)

0
Levi Mootz

再帰的にやりたい場合

function fib($n, $first, $second) {
    if( $n > 0 ) {
         $sum = $first + $second;
         $first = $second;
         $second = $sum;
         print $sum;
         fib($n-1, $first, $second);
    }
}
0
AbhishekS

このページ うまくいきました。参考にしてください。ありがとう!

<?php

function printFibonacci($n)
{

  $first = 0;
  $second = 1;

  echo "Fibonacci Series \n";

  echo $first.' '.$second.' ';

  for($i = 2; $i < $n; $i++){

    $third = $first + $second;

    echo $third.' ';

    $first = $second;
    $second = $third;

  }
}

/* Function call to print Fibonacci series upto 6 numbers. */

printFibonacci(6);

?>

または

<?php

define('NUM',11);
$a = 0;
$b = 1;

echo "$a $b "; // 0 1

for($i=1   ; $i<= NUM-2 ;  $a=$b, $b=$c, $i++ ) 
{
  echo $c = $a+$b;
  echo " ";
}

?>
0
Gregorio
<?php
$num = array(0, 1);

for ($i=0; $i<=10; $i++) 
{
   $new_num = $num[$i-1] + $num[$i-2];
   array_Push($num, $new_num);
}

echo implode(', ',$num);
?>
0
Sham Haramalkar

私は最近この質問に出くわし、あなたの質問を見つけました。あなたは途中にいたので、コードを作業バージョンに変更しました。

<?php

function fib ($n) { // a function called fib, declaire variable n (the sequence number)
    if($n==0) return 0;
    if ($n < 3) { return 1; } // if n is smaller than 3 return n (1 or 2)
    else { return fib ($n - 1) + fib ($n - 2); }
    /* if the number is 3 or above do 2 sums (n-1) and (n-2)
    and then add the 2 sums together (n-1)+(n-2)
    Example Fibonacci number 4
    (4-1)+(4-2) = 5
    3 + 2 = 5
    */

}

        echo fib(50);
0
mirza

解決策:機能PHPフィボナッチ数列のコード

$prev = 0;
$curr = 1;
$fib = 0;
for($i=0;$i<=20;$i++){
    echo $fib . ",";               
    $prev = $curr;
    $curr = $fib;
    $fib = $prev + $curr; 
}
0
Ata ul Mustafa
    <?php
echo"Ashutosh Verma Branch_IT_9889313834";
echo"<br />";
echo "Fibonacci Series Up to 10th term is:-"."<br />";
$fibonacci=0;
$a=0;
$b=1;
echo $a.",";
echo $b.",";
while($fibonacci<20)
{
$c=$a+$b;
echo $c.",";
$a=$b;
$b=$c;
$fibonacci=$fibonacci + 1;
}
?>
------------------------------------------OUTPUT-------------------------------------
Ashutosh Verma Branch_IT_9889313834
Fibonacci Series Up to 10th term is:-
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,
0
Ashutosh Verma
<?php
    function generateFibonacci($n, $previous = 0, $current = 1) {
        echo $previous == 0 ? $previous.'<br />'.$current.'<br />' : $current . '<br />';

        return $n == 1 ? null : generateFibonacci($n - 1, $current, $previous + $current);
    }

    generateFibonacci(20);
?>
0
Bellal Mohamed
$count = 0;
$x = 0;
$y = 1;

echo $x."<br />";
echo $y."<br />";

while($count < 10) {
    $z = $x + $y;
    echo $z."<br />";
    $x = $y;
    $y = $z;
    $count ++;
}

参照: http://blog.innovsystems.com/php/fibonacci-series-program-php

0
Balaji D
// Use this
 function printFibonacci($n)
 {

  $first = 0;
  $second = 1;

  echo "Fibonacci Series n => ";

  echo $first.' '.$second.' ';

  for($counter = 2; $counter < $n; $counter++){

    $third = $first + $second;

    echo $third.' ';

    $first = $second;
    $second = $third;

    }
}

/* Function call to print Fibonacci series upto 10 numbers. */

printFibonacci(10);
0
Purushottam
  class fibonacci
   {

   public $x = 0;
   public $y = 1;

   public function fibonacci() {
    for ($i = 0; $i <= 10; $i++) {
     $z = $this->x + $this->y;
     echo $z;
     echo "<br>";
     $this->x = $this->y;
     $this->y = $z;
    }

   }

   }

  $objfib = new fibonacci();
///Output
1
2
3
5
8
13
21
34
55
89
144
0
debasish

これは私が作ることができるのと同じくらい速くて簡単です

_function fibonacci($n, $rec = 0) {
    echo "$n\t";
    fibonacci($n + $rec, $n);
}
echo fibonacci(1);
_

header('Content-Type: text/plain');を含めると、\ tタブが表示されます。

0
Chris K

より読みやすく、非再帰的なアプローチ:

function fibonacciSequence($max = 13) {
    if($max < 1)
        return [];

    $sequence = [];

    $older = 0;
    $newer = 1;

    do {
        $number = $newer + $older;
        $sequence[] =  $number;

        $older = $newer;
        $newer = $number;
    } while($number < $max);

    return $sequence;
}
0
Pedro Moreira
    <?php
    $b=1; $limit=500;
    for($a=$b++;$a<$limit;$b+=$a=$b-$a)    
    {    
       echo"$a<br>"; 
      }   
   ?>

*編集:最初に$b=1; $a=$b+$a$b=1 =>から始めましょう$a=$b++;と言うことができます。次に、制限を設定します$a<$limit;今最も難しい部分$b+=$a=$b-$a$b=$b+$a;$a=$b-$a;は、このコードを一緒に操作して楽しみます

ステップ1:a ---> 1 .... b ---> 2 // bは= 1 a = 1 => b = b + a = 1 + 1 = 2でした

ステップ2:a ---> 1 .... b ---> 3 // bは2だったa = b-a = 2-1 = 1 => b = b + a = 2 + 1 = 3

ステップ3:a ---> 2 .... b ---> 5 // b was 3 a = b-a = 3-1 = 2 => b = b + a = 3 + 2 = 5

出力:1 1 2 3 5 8 13 21 34 55 89 144 233 377

0
BARIS KURT

フィボナッチは再帰することで簡単に取得できます

function printFibo($prev, $next) {
   if($prev > 10000000000000) return;
   $num = $prev + $next;

   echo "$num<br>";
   printFibo($next, $num); 
}

printFibo(0, 1);
0
Den Nikitin