web-dev-qa-db-de.com

PHP Fibonacci-Folge

Diese PHP-Methode setzt voraus, dass die Fibonacci-Sequenz mit einer for-Schleife bis zu einem angegebenen Wert gedruckt wird. Ich bin nicht sicher, warum es nicht funktioniert.

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

Es gibt tatsächlich eine Möglichkeit, eine Fibonacci-Zahl ohne Iteration durch Runden zu berechnen:

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

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

Einfache Funktion von Fibonacci

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

In diesem Beispiel verwende ich eine for-Schleife und beschränke die Länge auf 10:

$x = 0;    
$y = 1; 

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

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

6

Ihr grundlegendes Verständnis für die Funktionsweise der Sprache scheint falsch zu sein. Sie definieren eine Funktion, rufen sie aber nie auf. Sie geben einen Parameter an, den Sie sofort überschreiben.

Versuche dies:

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

Ich weiß, dass ich 1 Jahr zu spät komme, aber hier ist mein Beitrag ... Es gibt 2 mögliche Lösungen:

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

Der erste ist eleganter und berechnet das Ergebnis genauso wie es mathematisch definiert wird. Das Problem ist, dass es für große $ n sehr teuer ist.

Der zweite ist viel schneller, aber Sie müssen sicherstellen, dass der Benutzer nur den ersten Parameter einstellt.

Ausführungszeit: 

$ n = 20, Fib1 = 0,092s, Fib2 = 0,001s

$ n = 30, Fib1 = 12,2827s, Fib2 = 0,001s

$ n = 40, fib1 => 500s fib2 = 0,001s

2
Petr

Sie überschreiben den $n, den Sie als Funktionsargument erhalten, wenn Sie $n als Schleifenzähler verwenden.

Befreien Sie sich von der for- Anweisung, lassen Sie nur den Hauptteil davon.

2
Oswald

du hast 2 Lösungen 

for-Schleife verwenden

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

rekursive Funktionen

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

print_r(rec_fib(6));

Fibonacci-Serie sieht aus wie:

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

Mehr Details anzeigen

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

Dies ist ineffizientes fib ($ n - 1) + fib ($ n - 2); Hier sind meine Lösungen mit Rekursion und ohne. Ich verwende keine angesammelten Wörterbücher wie $ fib [1..N] = [], aber ich berechne die Stufensumme und leite sie an den nächsten Wiederholungs- oder Rekursionsaufruf weiter. 

// 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

Dies ist die von mir verwendete Methode:

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

Zur Erklärung besuchen Sie hier

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

Rekursive Fib

1
François P.

Ich wurde neulich gebeten, eine Fibonacci-Funktion in einem Interview zu schreiben. Ich dachte über eine Rekursion nach, dachte aber damals, dass dies ineffizient wäre.

Am Ende habe ich meine so geschrieben:

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

Sie wollten nur die endgültige Antwort, obwohl sie offensichtlich leicht modifiziert werden könnte, um jede Iteration auf ein Array zu übertragen.

Später habe ich meine gegen eine rekursive Version getestet ... meine ist schneller.

Wenn $ num> 1476 ist, gibt es INF zurück, also gehe ich davon aus, dass Sie dort den maximalen Integer-Wert von php treffen.

Verwandle 1476 zum Spaß in eine rekursive Fibonacci-Funktion und beobachte, wie dein Computer schmilzt :-)

0
Levi Mootz

Wenn Sie es rekursiv machen wollen

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

Diese Seite hat es gut gemacht. Sie können es auf Referenzen überprüfen. Vielen Dank!

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

?>

Oder

<?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

Ich bin kürzlich auf diese Frage gestoßen und habe Ihre Frage gefunden. Sie waren auf halbem Weg, dann habe ich Ihren Code in eine funktionierende Version geändert.

<?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
motto

Lösung: PHP Code für Fibonacci-Sequenz arbeiten

$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 ++;
}

Siehe: 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

Dieses ist so schnell und so einfach wie ich es machen könnte

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

Fügen Sie header('Content-Type: text/plain'); hinzu, um die Registerkarten\t anzuzeigen.

0
Chris K

Ein besser lesbarer, nicht rekursiver Ansatz:

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>"; 
      }   
   ?>

* BEARBEITEN: Beginnen wir mit $b=1; $a=$b+$a und $b=1 =>. Am Anfang können wir $a=$b++; sagen. Dann setzen wir ein Limit $a<$limit;, und der härteste Teil $b+=$a=$b-$a bedeutet $b=$b+$a; und $a=$b-$a;.__

schritt 1: a ---> 1 .... b ---> 2 // b war = 1 a = 1 => b = b + a = 1 + 1 = 2

schritt 2: a ---> 1 .... b ---> 3 // b war 2 a = b-a = 2-1 = 1 => b = b + a = 2 + 1 = 3

schritt 3: a ---> 2 .... b ---> 5 // b war 3 a = b-a = 3-1 = 2 => b = b + a = 3 + 2 = 5

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

0
BARIS KURT

Fibonaccies sind durch Rekursion so leicht zu bekommen

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

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

printFibo(0, 1);
0
Den Nikitin