国产精品19区精品中文字幕最新|激情视频高清无码久爱国产在线资源|亚州伊人无码综2018亚洲天堂|国产精品毛区无码国产二区三区视频|国产A级直播国产专区第一页|一区二区黄片91嫩草国产线|18综合视频欧美日韩六区|天天拍,夜夜激情午夜精品

  • 服務(wù)熱線:400-103-0299
  • 在線客服
  • 手機(jī)端
    公眾號二維碼

PHP算法:斐波那契數(shù)列的5種算法


發(fā)布日期:2023-05-11

       前段時(shí)間,遇到優(yōu)化計(jì)算斐波那契數(shù)列的常規(guī)遞歸方法,但是一時(shí)間并沒有及時(shí)想到很好的方法,所以后面查找了相關(guān)資料,總結(jié)了多種計(jì)算解法,所以分享出來,沈陽網(wǎng)站建設(shè)和大家一起交流學(xué)習(xí)。

       斐波那契數(shù)是什么

       斐波那契數(shù)列(Fibonacci sequence),又稱黃金分割數(shù)列、因數(shù)學(xué)家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數(shù)列”,指的是這樣一個(gè)數(shù)列:1、1、2、3、5、8、13、21、34、……在數(shù)學(xué)上,斐波那契數(shù)列以如下被以遞推的方法定義:F(1)=1,F(xiàn)(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)。知道了斐波那契數(shù),那么下面我們就用多種不同的方法來計(jì)算獲取第N位斐波那契數(shù)。

       1.普通遞歸

       這種方法是最常規(guī)的,直接根據(jù)定義F(n)=F(n - 1)+F(n - 2)遞歸計(jì)算即可,但是性能是最低的。/** * 普通遞歸 * @param int $n * @return int */function fib($n = 1){ // 低位處理 if ($n < 3) { return 1; } // 遞歸計(jì)算前兩位 return fib($n - 1) + fib($n - 2);}

       2.遞歸優(yōu)化

       從上面的遞歸方法可以看到,進(jìn)行了很多的重復(fù)計(jì)算,性能極差,如果N越大,計(jì)算的次數(shù)太可怕了,那么,既然因?yàn)橹貜?fù)計(jì)算影響了性能,那么優(yōu)化就從減少重復(fù)計(jì)算入手,即把之前計(jì)算的存儲起來,這樣就避免了過多的重復(fù)計(jì)算,優(yōu)化了遞歸算法。/** * 遞歸優(yōu)化 * @param int $n * @param int $a * @param int $b * @return int */function fib_2($n = 1, $a = 1, $b = 1){ if ($n > 2) { // 存儲前一位,優(yōu)化遞歸計(jì)算 return fib_2($n - 1, $a + $b, $a); } return $a;}

       3.記憶化自底向上

       自底向上通過迭代計(jì)算斐波那契數(shù)的子問題并存儲已計(jì)算的值,通過已計(jì)算的值進(jìn)行計(jì)算。使用for循環(huán),減少遞歸帶來的重復(fù)計(jì)算問題。/** * 記憶化自底向上 * @param int $n * @return int */function fib_3($n = 1){ $list = []; for ($i = 0; $i <= $n; $i++) { // 從低到高位數(shù),依次存入數(shù)組中 if ($i < 2) { $list[] = $i; } else { $list[] = $list[$i - 1] + $list[$i - 2]; } } // 返回最后一個(gè)數(shù),即第N個(gè)數(shù) return $list[$n];}

       4.自底向上進(jìn)行迭代

       最低位初始化賦值,使用for從低位到高位迭代計(jì)算,從而得到第N個(gè)數(shù)。/** * 自底向上進(jì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; // 循環(huán)計(jì)算 for ($i = 2; $i < $n; $i++) { $b = $a + $b; $a = $b - $a; } return $b;}

       5.公式法

       通過了解斐波那契序列和黃金分割比之間的關(guān)系,使用黃金分割率計(jì)算第N個(gè)斐波那契數(shù)。/** * 公式法 * @param int $n * @return int */function fib_5($n = 1){ // 黃金分割比 $radio = (1 + sqrt(5)) / 2; // 斐波那契序列和黃金分割比之間的關(guān)系計(jì)算 $num = intval(round(pow($radio, $n) / sqrt(5))); return $num;}