面试 斐波那契数列
今天无意中看到了公司面试的一道题,即斐波那契数列,也叫黄金分割数列,就自己想想做了下。
因为这种数列有个很明显的特征,即当前项值等于前一项和前前一项的和,直观印象肯定是递归。
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!
越努力越幸运