PHP计算斐波那契值

177 阅读1分钟

记在年初面试做面试题出了一道关于计算斐波那契值问题

题上给出的是用下面递归的方法计算出来的值
function fib_recursive($n){
    return ($n==0 || $n==1)?1:fib_recursive($n-1)+fib_recursive($n-2);
}
说出算法存在的不足之处和改进算法
一开始看这道题的时候是不是觉得这样写是正确的,没神马问题,我当时也没有想到这个算法有什么问题,更别说怎么优化了
今天在看代码大全2的时候忽然发现了答案,下面给出作者的原话:

在计算机教书中存在这样的缺陷,那就是用愚蠢的例子来讲解递归。典型的例子就是计算阶乘或者斐波那契数列。递归是一种强有力的工具,但是把它用在这两者中的任何一个都是愚蠢之极的,如果为我工作的程序员用递归去计算阶乘我宁愿换人。除了速度缓慢,并且无法预测运行期间的内存使用情况之外,用递归写出的子程序摇臂循环写出的子程序更难理解。

下面是用循环写出的:

  function fib_recursive($n){
      $arr=[];
      for($i=0;$i<=$n;$i++)
      {
          if($i==0 || $i==1){
              $arr[$i]=1;
          }else{
          $arr[$i]=$arr[$i-1]+$arr[$i-2];
          }
      }
      return $arr[$n];
  }

上面的内容都是自己打出来的,如有错误,还请海涵。。。