斐波那契數,亦稱之為斐波那契數列(義大利語: successione di fibonacci),又稱**分割數列、費波那西數列、費波拿契數、費氏數列,指的是這樣乙個數列:1、1、2、3、5、8、13、21、……在數學上,斐波那契數列以如下被以遞迴的方法定義:f
0=0,f
1=1,fn=f
n-1+f
n-2(n>=2,n∈n*),用文字來說,就是斐波那契數列列由 0 和 1 開始,之後的斐波那契數列係數就由之前的兩數相加。
1 使用遞迴方法。 順著思路去想, f(1)= 1; f(2) = 1 ; f(3) = f(2)+f(1) f(4) = f(3)+f(2) 3
//使用遞迴方式求斐波那契數
public function fb($n)else
}
2使用遞推方法。
public function fb2($n)
$t1 = 1;$t2 = 1;
for($i=3;$i<$n;$i++)
return $t1 + $t2;
}
最後,進行效能分析。
明顯的可以**,遞迴方法,每多一層,就要向下遞迴兩次。 約為 o(2 的n次方) 而遞推演算法為 o(n),實測**如下。
/**效能測試。*/
function bench_profile($starttime , $flag = '')
//使用遞迴演算法。
ini_set("max_execution_time" ,3600);
$s = explode(' ',microtime());
echo bench_profile($s )."
"; echo fb(35); //使用遞迴 耗時 40.925 sec 每往上乙個數約慢兩倍
echo bench_profile($s )."
";//使用遞推演算法。
$s = explode(' ',microtime());
echo bench_profile($s )."
"; echo fb2(35); //使用遞推 時間極短。
echo bench_profile($s )."
";
總結:
使用遞迴演算法,到求第100 個
斐波那契數
時會卡到機器跑不動,而使用遞推演算法,幾乎不費時間。
演算法複雜度是非常重要的概念,也是區分程式設計師的一把好尺子。
斐波那契數列 的兩種實現方式
一 先要回答乙個問題 什麼是婓波那契數列?答案在這裡 二 看 1 第一方法 遞迴實現 public static void main string args public static int fibonacci int i else if i 1 return fibonacci i 2 fibo...
迴圈斐波那契數列 斐波那契數列的兩種實現
最先研究這個數列的人是義大利人斐波那契,leonardo fibonacci,他在描述兔子生長的數目時用上了這數列 每個月兔子的總對數,就是這樣乙個序列 1,1,2,3,5,8,13,21.這個序列從第三項開始,每一項都等於前兩項之和。在數學上,斐波那契數列是以遞迴的方法來定義 f 1 1 f 2 ...
斐波那契數列的兩種優化
遞迴存在許多子問題的重複計算問題,時間複雜度較高。public class fbsl public static intfb int n 首先我們需要乙個全域性的雜湊表來儲存當你第n個數所對應的前兩個數的和。class fb 一旦發現我曾經計算過我就不再遞迴計算,直接返回map集合存的值 if ma...