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種演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用C++中的斐波那契數列演算法斐波那契數列是一個非常經典的數列,它的定義是每個數字都是前兩個數字總和。在電腦科學中,用C++程式語言來實作斐波那契數列演算法是一項基礎且重要的技能。本文將介紹如何使用C++來編寫斐波那契數列演算法,並提供具體的程式碼範例。一、遞歸方法遞歸是斐波那契數列演算法的常用方法。在C++中,使用遞歸可以簡潔地實作斐波那契數列演算法。下面

在PHP程式設計中,演算法是不可或缺的一部分。掌握常見的演算法,不僅可以提高程式碼效率,還可以為後續的程式設計提供協助。以下是PHP程式設計中常見的演算法:排序演算法排序演算法是指將一組資料依照一定的規則排列成有序的序列。在PHP編程中,常用的排序演算法有冒泡排序、插入排序、選擇排序、快速排序等。其中,快速排序是時間複雜度最低的一種排序演算法,適合處理大規模的資料。尋找演算法查找演算法

如何用Python寫出求解斐波那契數列的演算法?斐波那契數列是一個經典的數列,其定義如下:第一個和第二個數都是1,從第三個數開始,每個數都是前兩個數之和。即:1,1,2,3,5,8,13,21,34,...在Python中,可以使用循環或遞歸的方式來編寫求解斐波那契數列的演算法。以下將分別介紹這兩種方法的具體實作。方法一:使用循環使用循環的方式

PHP是一種非常流行的程式語言,它支援各種資料類型和演算法,其中數組排序和搜尋演算法是基本且重要的部分。本文將會介紹PHP常用的陣列排序及搜尋演算法,以及它們的應用場景與效率分析。一、陣列排序PHP中提供了多種陣列排序的方法,包括冒泡排序、插入排序、選擇排序、快速排序、歸併排序等等。以下是對其中常用的幾種演算法的介紹及範例程式碼:冒泡排序(BubbleSort)冒

斐波那契數列是透過將前兩個數字相加得到的一系列數字。斐波那契數列從兩個數字f0和f1開始。 fo和f1的初始值可以取0、1或1、1。 Fibonacci序列滿足以下條件:fn=fn-1+fn-2演算法參考Fibonacci序列的演算法。 STARTStep1:Readintegervariablea,b,catruntimeStep2:Initializea=0andb=0Step3:Computec=a+bStep4:PrintcStep5:Seta=b,b=cStep6:Repeat3to5fornt

PHP是一种广泛应用于Web开发的脚本语言,且在建立动态网站上表现得越来越好。在Web开发中,数据结构和算法的重要性并不低于其他编程范畴,其对于程序运行效率的影响尤为显著。尤其是在涉及大量数据存储和处理,或者对程序性能要求较高的场景下,数据结构和算法成为了不可忽视的一部分。本文主要介绍PHP中一些常用的数据结构和算法。一、数据结构数组PHP数组是一种非常常见

隨著網路的普及和應用的不斷擴大,程式語言的發展也變得越來越重要。 PHP作為一種非常流行的程式語言,也在不斷的發展中。 PHP開發者在使用PHP進行程式設計的過程當中,可能會面對到需要對一些知識進行表示,以及需要進行自動生成演算法的問題。那麼,PHP如何進行知識表示和自動生成演算法呢?以下本文將會對此進行探討。一、知識表示知識表示是人工智慧領域中非常重要的一個問題。知

深入理解PHP和Vue在腦圖功能中的核心演算法引言:在現代的網路時代,我們經常使用各種各樣的應用程式來幫助我們組織和管理資訊。腦圖是一種常見且實用的資訊組織方式,它能夠將複雜的思考過程以圖形化的方式展示出來。在本文中,我們將著重討論PHP和Vue在腦圖功能中的核心演算法,並給出程式碼範例。一、腦圖的特徵腦圖是一種以中心主題為核心,透過樹狀結構來展示與該主題相關的
