首先來介紹一下斐波那契數列:
斐波那契數列
(fibonacci sequence),又稱
**分割
數列。因
數學家列昂納多·斐波那契(leonardoda fibonacci)以兔子繁殖為例子而引入,故又稱為「
兔子數列
」。指的是這樣乙個數列:1、1、2、3、5、8、13、21、34、……
從定義可以看出斐波那契數列就是第一二項都是1,從第三項開始,每一項為前兩項之和。那麼要想知道每一項,只要知道前兩項就可以得到了,前兩項怎麼得到?根據這同一種套路,直到前兩項分別為第一二項(都是1),所有的不就都解決了。既然這樣,很容易的就想到可以利用遞迴的方式去實現它了。
方法一:遞迴實現
這種方式雖然可以實現,而且**也是很簡單,但是很遺憾的是,它有乙個很大的缺陷。就以求第5項為例子來分析一下:
通過上圖可以看到,當求f(5)時,需要遞迴呼叫很多次,關鍵是其中有時候做的事情還是完全一樣的,比如f(3)求了兩次。當求得不是第5項而是更大的項,那麼重複的會更多。我們都知道呼叫函式的開銷是很大的,而該種方法就是在不斷地呼叫同乙個函式還做著許多無用功,它的時間複雜度高達o(2^n),可見它的效率是很低的。
方法1是由需要求的那一項倒著會去求,然後在依次返回,從而導致做了很多無用功,那麼,如果從第一項開始,從前依次往後求,直到將需要求的那項求出來,這樣就不會有重複求某一項的事情發生了,效率相對也就高一些了。
方法二:遞迴高階版
這種方法相對方法1來說,其
時間複雜度為o(n),空間複雜度為o(1),
效率稍微要高一點,但可能不太好理解。可以將它的呼叫過程畫出來幫助理解。
既然可以使用遞迴,那麼毫無疑問,也是可以使用迴圈來實現的。
方法三:
這種方法
的時間複雜度為o(n),空間複雜度為o(1),
很簡單,在這裡就不多做解釋了。
方法四:
利用陣列將斐波那契數列的元素存起來,一般用於求斐波那契數列的前n項
方法四的時間複雜度為o(n),空間複雜度為o(n),是一種效率比較高的方法。
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
迴圈斐波那契數列 斐波那契數列的兩種實現
最先研究這個數列的人是義大利人斐波那契,leonardo fibonacci,他在描述兔子生長的數目時用上了這數列 每個月兔子的總對數,就是這樣乙個序列 1,1,2,3,5,8,13,21.這個序列從第三項開始,每一項都等於前兩項之和。在數學上,斐波那契數列是以遞迴的方法來定義 f 1 1 f 2 ...
六種方式實現斐波那契數列
由於double型別的精度還不夠,所以程式算出來的結果會有誤差,如果把公式展開計算,得出的結果就是正確的。完整的實現 如下 view plain include iostream include queue include cmath using namespace std int fib1 int...