【问题标题】:PHP Fibonacci SequencePHP 斐波那契数列
【发布时间】:2013-03-14 01:30:17
【问题描述】:

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

【问题讨论】:

  • 好吧,你不会把 1 打印两次吧..?为什么会有特殊情况?序列的重点是没有特殊情况......
  • 是有错字还是你根本没有调用这个函数?
  • 可能只是循环有问题,但我不太明白?我现在看到一个问题,因为它只会打印一个数字?
  • 我的错,问是否可以在方法内部调用方法是个愚蠢的问题吗?
  • @Jesse 是的,你可以。您通常会在 ID 生成函数中看到它的一个示例,您要在其中生成一个 id,检查它是否未被使用,以及它是否从自身内部再次调用该函数。

标签: php for-loop


【解决方案1】:

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

试试这个:

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

【讨论】:

  • 是否可以在每次for循环循环时调用该方法以显示序列中的每个数字?
  • echo 行的作用是什么。
  • @NiettheDarkAbsol 我不是 php 人,但我相信 echo 更像是 javascript 中的 console.log(..) 或 python 中的 print
【解决方案2】:

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

去掉for-statement,只留下它的主体。

【讨论】:

    【解决方案3】:

    试试这个。优化功能

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

    【讨论】:

      【解决方案4】:

      如果你想递归地这样做

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

      【讨论】:

        【解决方案5】:

        斐波那契的简单函数

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

        【讨论】:

        • 我唯一不喜欢的是添加 $first 和 $second 作为参数,即使它们是默认的。显示错误的代码,斐波那契很可能是编码测试,所以这是一个减号。跨度>
        【解决方案6】:
        function fib($m){
            $j=0;$k=1;
            for($i=0;$i<=$m;$i++){
                  $l=$k;
                  $k=$j+$k;
                  $j=$l;
              }
           return $k;
        }
        

        【讨论】:

          【解决方案7】:
          $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

          【讨论】:

          • 我相信您的代码对提出问题的人有所帮助,但并不能真正回答他的问题。该代码也没有实现他正在寻找的功能。多一点解释可能会对他有所帮助。
          【解决方案8】:

          我知道我迟到了 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

          【讨论】:

            【解决方案9】:

            在本例中,我使用了一个 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

            【讨论】:

            • 不错的简单方法。 “正确”的斐波那契数列在开头包含两个 1,因此我建议在进入 for 循环之前回显 $y
            • 你应该在 for 循环之前回显 $x 和 $y 即0 1
            【解决方案10】:

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

            $prev = 0;
            $curr = 1;
            $fib = 0;
            for($i=0;$i<=20;$i++){
                echo $fib . ",";               
                $prev = $curr;
                $curr = $fib;
                $fib = $prev + $curr; 
            }
            

            【讨论】:

              【解决方案11】:

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

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

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

              【讨论】:

              • 从 PHP 5.6 开始,您可以使用 exponentiation operator (**): round(((5 ** .5 + 1) / 2) ** $n / 5 ** .5)
              • 让我对上面的解决方案进行一些优化:而不是使用整个表达式:((5 ** .5 + 1) / 2),它实际上是一个黄金比例 - 使用 1.618 就足够了,而不是使用 5 ** .5只是2.236 常量,因此我们有round(1.618 ** $n / 2.236)。另一个注意事项 - 使用 round 您可以计算前 70 个序列号,>70(取决于 32/64 拱)该数字将使用科学记数法转换为双倍,但您可以使用 number_format/sprintf
              【解决方案12】:
                  function fibonacci( $n ) {
              if (( $n == 0 ) || ( $n == 1 )) {
                   return $n;
              }
              return fibonacci( $n-2 ) + fibonacci( $n-1 );}
              

              【讨论】:

                【解决方案13】:

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

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

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

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    【解决方案15】:

                    这是我使用的方法:

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

                    解释请访问here

                    【讨论】:

                      【解决方案16】:

                      一种更易读、非递归的方法:

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

                      【讨论】:

                      • 在 PHP 中你不会经常看到 do/while,这正是使用它的一个例子,所以 +1。
                      【解决方案17】:
                      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

                      【讨论】:

                        【解决方案18】:

                        斐波那契数列如下:

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

                        View more detail

                        【讨论】:

                          【解决方案19】:

                          这是低效的 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;
                          }
                          

                          【讨论】:

                            【解决方案20】:
                                <?php
                                $b=1; $limit=500;
                                for($a=$b++;$a<$limit;$b+=$a=$b-$a)    
                                {    
                                   echo"$a<br>"; 
                                  }   
                               ?>
                            

                            *编辑:让我们从$b=1; $a=$b+$a$b=1 =&gt; 开始,我们可以说$a=$b++; 然后我们限制@9​​87654327@ 现在最难的部分$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

                            【讨论】:

                            • 虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation of howwhy 这解决了问题。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人!请edit您的答案添加解释,并说明适用的限制和假设。
                            • 好的。我添加了一些解释@TobySpeight
                            【解决方案21】:

                            This page 做得很好。您可以检查它以获取参考。谢谢!

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

                            【讨论】:

                              【解决方案22】:
                              <?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);
                              ?>
                              

                              【讨论】:

                              • 虽然答案总是很受欢迎,但这个问题是在 4 年前 之前提出的,并且已经有了一个公认的解决方案。请尽量避免通过提供答案来将问题“颠倒”到顶部,除非该问题尚未标记为已解决,或者您找到了针对该问题的新的和改进的解决方案。还记得提供一些context surrounding your code 来帮助解释它。查看writing great answers 上的文档,了解如何让您的答案发挥作用的一些提示:)
                              【解决方案23】:
                              <?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);
                              ?>
                              

                              【讨论】:

                                【解决方案24】:

                                我的是一个简单的获取fibonacii系列的方法,看看这个:

                                function fibo() {
                                    $a = 0;
                                    $b = 1;
                                
                                    echo $a;
                                    for ($i=0; $i < 10; $i++) { 
                                        echo ' '.$b.' ';
                                        $sum = $a + $b;
                                        $a = $b;
                                        $b = $sum;
                                    }
                                }
                                

                                【讨论】:

                                【解决方案25】:
                                  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
                                

                                【讨论】:

                                  【解决方案26】:

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

                                  function printFibo($prev, $next) {
                                     if($prev > 10000000000000) return;
                                     $num = $prev + $next;
                                  
                                     echo "$num<br>";
                                     printFibo($next, $num); 
                                  }
                                  
                                  printFibo(0, 1);
                                  

                                  【讨论】:

                                    【解决方案27】:
                                        <?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,
                                    

                                    【讨论】:

                                      【解决方案28】:

                                      你有两个解决方案

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

                                      【讨论】:

                                        【解决方案29】:
                                        // 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);
                                        

                                        【讨论】:

                                          【解决方案30】:

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

                                          我最后是这样写的:

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

                                          【讨论】:

                                            猜你喜欢
                                            • 2015-06-05
                                            • 2013-08-03
                                            • 2014-05-19
                                            • 2015-08-30
                                            • 2013-02-24
                                            • 1970-01-01
                                            • 2018-01-30
                                            相关资源
                                            最近更新 更多