面试 斐波那契数列

  今天无意中看到了公司面试的一道题,即斐波那契数列,也叫黄金分割数列,就自己想想做了下。

  因为这种数列有个很明显的特征,即当前项值等于前一项和前前一项的和,直观印象肯定是递归。

1.递归

// 0 1 1 2 3 5 8 ...
public function 斐波那契数列递归($n){
        if($n<=0){
            return -1;
        }elseif($n==1){
            return 0;
        }elseif($n==2){
            return 1;
        }
        $value=$this->斐波那契数列递归($n-1)+$this->斐波那契数列递归($n-2);
        return $value;
}

但是递归虽然非常简单,但是耗费的资源太大,时间太长。而且递归和迭代可以互相转化,所以试试迭代,性能明显提高。

2.迭代

// 0 1 1 2 3 5 8 ...
public function 斐波那契数列($n){
        // 0 1 1 2 3 5 8 ...
        if($n<=0){
            return -1;
        }elseif($n==1){
            return 0;
        }elseif($n==2){
            return 1;
        }
        //拿到数列的前两项作为开始值
        $prev=0;//前一项
        $curr=1;//当前值
        $k=2;//步长
        while($k<$n){
            $temp=$curr;
            $curr=$curr+$prev;
            $prev=$temp;
            $k++;
        }
        return $curr;
        
 }

over!

 

posted @ 2016-10-11 17:30  tianye_guazi  阅读(142)  评论(0编辑  收藏  举报