8

这个 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;
?>
4

34 回答 34

42

实际上有一种方法可以通过使用舍入来计算斐波那契数而无需迭代:

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

function getFib($n)
{
    return round(pow((sqrt(5)+1)/2, $n) / sqrt(5));
}
于 2014-11-28T13:57:59.463 回答
8

斐波那契的简单函数

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));
于 2013-08-09T20:38:57.030 回答
6

在此示例中,我使用了 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

于 2014-04-17T06:34:59.820 回答
3

您对语言工作原理的基本理解似乎是错误的。您正在定义一个函数,但从不调用它。您正在提供一个参数,然后您会立即覆盖该参数。

尝试这个:

$fib = [1,0];
for($i=0; $i<30; $i++) {
    $next = array_sum($fib);
    array_shift($fib);
    array_push($fib,$next);
    echo $next.", ";
}
于 2013-03-24T15:09:21.563 回答
3

我知道我迟到了 1 年,但这是我的贡献。有两种可能的解决方案:

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 来说非常昂贵。

第二个要快得多,但您必须确保用户只设置第一个参数。

执行时间处理时间:

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

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

$n = 40, fib1 = >500s fib2 = 0.001s

于 2014-03-13T06:29:50.333 回答
3

你有 2 个解决方案

使用 for 循环

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));
于 2018-08-23T07:21:45.440 回答
2

$n当您让$n成为循环计数器时,您将覆盖作为函数参数获得的。

摆脱 -for语句,只留下它的主体。

于 2013-03-24T15:09:37.383 回答
1
function fib($m){
    $j=0;$k=1;
    for($i=0;$i<=$m;$i++){
          $l=$k;
          $k=$j+$k;
          $j=$l;
      }
   return $k;
}
于 2013-10-02T05:23:45.380 回答
1
    function fibonacci( $n ) {
if (( $n == 0 ) || ( $n == 1 )) {
     return $n;
}
return fibonacci( $n-2 ) + fibonacci( $n-1 );}
于 2014-12-13T14:39:53.773 回答
1

这是我使用的方法:

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

有关说明,请访问此处

于 2015-06-18T13:39:54.210 回答
1

一种更具可读性的非递归方法:

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;
}
于 2015-08-21T13:27:52.017 回答
1

斐波那契系列看起来像:

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

查看更多详情

于 2017-01-18T20:43:12.927 回答
1
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

于 2016-07-01T10:57:10.510 回答
1

这是低效的 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;
}
于 2017-02-06T13:33:04.287 回答
0

这个是我能做到的又快又简单

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

包括header('Content-Type: text/plain');以查看 \t 选项卡。

于 2015-03-24T02:42:38.413 回答
0
$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

于 2013-12-19T18:28:16.897 回答
0

解决方案:用于斐波那契数列的 PHP 代码

$prev = 0;
$curr = 1;
$fib = 0;
for($i=0;$i<=20;$i++){
    echo $fib . ",";               
    $prev = $curr;
    $curr = $fib;
    $fib = $prev + $curr; 
}
于 2014-11-12T18:11:48.140 回答
0

我最近遇到了这个问题,发现了你的问题。您已经完成了一半,然后我将您的代码修改为工作版本。

<?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);
于 2015-04-05T17:46:02.100 回答
0

如果你想递归地做

function fib($n, $first, $second) {
    if( $n > 0 ) {
         $sum = $first + $second;
         $first = $second;
         $second = $sum;
         print $sum;
         fib($n-1, $first, $second);
    }
}
于 2013-03-24T15:36:56.800 回答
0
  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
于 2018-01-05T07:23:44.870 回答
0
$first=0;
$second=1;
$nex=0;
$num=10;
for($c=0;$c<$num;$c++)
{
    if($c<=1)
    {
       $next=$c; 
    }
    else
    {
    $next=$first+$second;
    $first=$second;
    $second=$next;    
    }
    echo $next;
}
于 2020-02-03T09:32:06.880 回答
0
// 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);
于 2018-12-17T10:35:20.433 回答
0
    <?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=ba=2-1=1 => b=b+a=2+1=3

第 3 步:a--->2....b--->5// b 为 3 a=ba=3-1=2 =>b=b+a=3+2=5

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

于 2017-03-02T03:12:28.917 回答
0
<?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);
?>
于 2017-10-21T22:08:46.333 回答
0
<?php

function fibonacciSequence($pos){

    $fibarray = array(0, 1);

   for ( $i=2; $i<=$pos; ++$i ) {
       $fibarray[$i] = $fibarray[$i-1] + $fibarray[$i-2];
   }

   return $fibarray;
}

echo "<pre>";
print_r(fibonacciSequence(5));
echo "<pre>";
于 2019-10-28T12:05:04.800 回答
0

前几天在一次采访中,我被要求写一个斐波那契函数。我考虑过递归,但当时我认为它效率低下。

我最终像这样写了我的:

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 传递给递归斐波那契函数,然后看着你的电脑融化 :-)

于 2019-05-17T10:44:52.540 回答
0

这个页面做得很好。您可以检查它以获取参考。谢谢!

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

?>
于 2017-07-06T09:59:50.783 回答
0

通过递归很容易得到斐波那契

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

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

printFibo(0, 1);
于 2018-06-23T20:47:25.240 回答
0

斐波那契数列看起来像: 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 ,144 表示如果将前两个值相加并且输出显示是下一个值。

1+2 = 3 3+5 = 8 Like this 如何在 PHP 中实现这种类型的输出

<?php
$num1 = 0 ; 
$num2 = 1 ; 

for ($i=0; $i<=10 ; $i++) { 
    # Foboniici
    $result = $num1 + $num2 ; 
    $num1 = $num2 ; 
    $num2 = $result ; 
    echo $result ; 
}
?>
于 2020-07-27T10:21:53.127 回答
0
<?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);
?>
于 2017-07-31T16:35:21.573 回答
0

尝试这个:

        function fibonacci($length)
    {
        $result = [];
    
        function start($index, $a = 0, $b = 1)
        {
            if ($index === 0) {
                return $a;
            }
    
            if ($index === 1) {
                return $b;
            }
    
            return start( $index- 1, $b, $a + $b);
        }
    
        for ($i = 0; $i <= $length; $i++) {
            $result[$i] = start($i);
        }
    
        return $result;
    }

var_dump(fibonacci(20));
于 2021-09-14T00:03:33.127 回答
-1

尝试这个。优化功能

function fib($n, $all=0){
f[0] = 1;
f[1] = 1;
for($i = 2; $i<= $n; $i++) f[$i] = f[$i-1]+f[$i-2];
if($all) return $f;
return $f[$n];
}

print fib(5);
var_dump(fib(5, 1));  
于 2013-03-24T15:24:08.607 回答
-1
    <?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,
于 2018-07-14T00:33:11.253 回答
-2

我的是获取 fibonacii 系列的简单方法,请查看:

function fibo() {
    $a = 0;
    $b = 1;

    echo $a;
    for ($i=0; $i < 10; $i++) { 
        echo ' '.$b.' ';
        $sum = $a + $b;
        $a = $b;
        $b = $sum;
    }
}
于 2017-11-23T09:57:23.757 回答