PHP之斐波那契数列的N种算法
前言
前段时间,碰到优化运算斐波那契数列的常规递归办法,但是一时间并没有及时想到很好的办法,所今后面查寻了相关材料,总结了多种运算解法,所以分享出来,和大家一起交流学习。
引荐:《PHP视频教程》
斐波那契数是啥
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁衍为例子而引入,故又称为“兔子数列”,指的是这样一个数列: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)
递归运算即可,但是机能是最低的。
/** * 一般递归 * @param int $n * @return int */function fib($n = 1){ // 低位处置 if ($n < 3) { return 1; } // 递归运算前两位 return fib($n - 1) + fib($n - 2); }
递归优化
从上面的递归办法可以看到,停止了许多的反复运算,机能极差,假如N越大,运算的次数太可怕了,那么,既然由于反复运算影响了机能,那么优化就从减少反复运算入手,即把此前运算的储备起来,这样就幸免了过多的反复运算,优化了递归算法。
/** * 递归优化 * @param int $n * @param int $a * @param int $b * @return int */function fib_2($n = 1, $a = 1, $b = 1){ if ($n > 2) { // 储备前一位,优化递归运算 return fib_2($n - 1, $a + $b, $a); } return $a; }
记忆化自底向上
自底向上通过迭代运算斐波那契数的子问题共存储已运算的值,通过已运算的值停止运算。使用for
轮回,减少递归带来的反复运算问题。
/** * 记忆化自底向上 * @param int $n * @return int */function fib_3($n = 1){ $list = []; for ($i = 0; $i <= $n; $i++) { // 从低到高位数,顺次存入数组中 if ($i < 2) { $list[] = $i; } else { $list[] = $list[$i - 1] + $list[$i - 2]; } } // 返回最后一个数,即第N个数 return $list[$n]; }
自底向上停止迭代
最低位初始化赋值,使用for
从低位到高位迭代运算,从而得到第N个数。
/** * 自底向上停止迭代 * @param int $n * @return int */function fib_4($n = 1){ // 低位处置 if ($n <= 0) { return 0; } if ($n < 3) { return 1; } $a = 0; $b = 1; // 轮回运算 for ($i = 2; $i < $n; $i++) { $b = $a + $b; $a = $b - $a; } return $b; }
公式法
通过理解斐波那契序列和黄金分割比之间的关系,使用黄金分割率运算第N
个斐波那契数。
/** * 公式法 * @param int $n * @return int */function fib_5($n = 1){ // 黄金分割比 $radio = (1 + sqrt(5)) / 2; // 斐波那契序列和黄金分割比之间的关系运算 $num = intval(round(pow($radio, $n) / sqrt(5))); return $num; }
无敌欠揍法
这个办法,我就不多说了吧,大家都懂的,但是千万别轻易尝试……
/** * 无敌欠揍法 * @param int $n * @return int */function fib_6($n = 1){ // 列举了30个数 $list = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269]; return $list[$n]; }
最后
好了,我就大约写了几种解法,假如有不合错误的地方,请大家指出,我会及时修改,大家有其他运算办法,欢迎分享出来一起交流和学习,感谢!
以上就是PHP之斐波那契数列的N种算法的具体内容,更多请关注百分百源码网其它相关文章!