PHP算法斐波那契数列的N种算法天隆网

前言前段时间,遇到优化计算斐波那契数列的常规递归方法,但是一时间并没有及时想到很好的方法,所以后面查找了相关资料,总结了多种计算解法,所以分享出来,和大家一起交流学习。斐波那契数是什么斐波那契数列(Fibonaccisequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(LeonardodaFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)(n≥3,n∈N*)。知道了斐波那契数,那么下面我们就用多种不同的方法来计算获取第N位斐波那契数。普通递归这种方法是最常规的,直接根据定义F(n)=F(n-1)+F(n-2)递归计算即可,但是性能是最低的。/***普通递归*

paramint$n*

returnint*/functionfib($n=1){//低位处理if($n3){return1;}//递归计算前两位returnfib($n-1)+fib($n-2);}递归优化从上面的递归方法可以看到,进行了很多的重复计算,性能极差,如果N越大,计算的次数太可怕了,那么,既然因为重复计算影响了性能,那么优化就从减少重复计算入手,即把之前计算的存储起来,这样就避免了过多的重复计算,优化了递归算法。/***递归优化*

paramint$n*

paramint$a*

paramint$b*

returnint*/functionfib_2($n=1,$a=1,$b=1){if($n2){//存储前一位,优化递归计算returnfib_2($n-1,$a+$b,$a);}return$a;}记忆化自底向上自底向上通过迭代计算斐波那契数的子问题并存储已计算的值,通过已计算的值进行计算。使用for循环,减少递归带来的重复计算问题。/***记忆化自底向上*

paramint$n*

returnint*/functionfib_3($n=1){$list=[];for($i=0;$i=$n;$i++){//从低到高位数,依次存入数组中if($i2){$list[]=$i;}else{$list[]=$list[$i-1]+$list[$i-2];}}//返回最后一个数,即第N个数return$list[$n];}自底向上进行迭代最低位初始化赋值,使用for从低位到高位迭代计算,从而得到第N个数。/***自底向上进行迭代*

paramint$n*

returnint*/functionfib_4($n=1){//低位处理if($n=0){return0;}if($n3){return1;}$a=0;$b=1;//循环计算for($i=2;$i$n;$i++){$b=$a+$b;$a=$b-$a;}return$b;}公式法通过了解斐波那契序列和黄金分割比之间的关系,使用黄金分割率计算第N个斐波那契数。/***公式法*

paramint$n*

returnint*/functionfib_5($n=1){//黄金分割比$radio=(1+sqrt(5))/2;//斐波那契序列和黄金分割比之间的关系计算$num=intval(round(pow($radio,$n)/sqrt(5)));return$num;}无敌欠揍法这个方法,我就不多说了吧,大家都懂的,但是千万别轻易尝试……/***无敌欠揍法*

paramint$n*

returnint*/functionfib_6($n=1){//列举了30个数$list=[1,1,2,3,5,8,13,21,34,55,89,,,,,,,,,,,,,,,,,,,,];return$list[$n];}


转载请注明:http://www.aierlanlan.com/tzrz/8314.html