關於斐波那契數列的演算法比較
如果沒看過錢能的在論壇的開發語言的c++區中,有人提到過有沒有人有什麼有趣的c語言題目.我當時推薦了這個斐波那契(fibonacci)數列,最開始我沒看錢能的書,也沒編寫出具體程式,只給了個大概思路,這裡,錢能用c++將幾種解決方法都寫出來了,看了深有啟發.
題目:古典題目,有一對兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。假設所有的兔子都不死,問每個月的兔子總數為多少。對應的數列就是斐波那契(fibonacci)數列:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n> 1).
思考:學習到了迴圈語句後老師就出了母牛問題給我們做.題目和兔子問題類似,思路也相同,程式顯得相當簡單.下面錢能給出了四個解決斐波那契(fibonacci)數列的程式:
演算法1:
int fibo1(int n)
演算法2:
int fibo2(int n)
演算法3:
int fibo3(int n)
演算法4:
int fibo4(int n)
這裡列出了4個演算法.下面就詳細說明一下四個演算法:
1.遞迴演算法:最好理解的演算法,和人的思路相當接近,對應的數學描述很清晰,容易程式設計.但是在c++語言中是使用棧機制實現的,如果使用遞迴函式,將會占用大量的記憶體資源,對記憶體中的棧區進行掠奪,在大量呼叫遞迴函式之後很可能造成記憶體崩潰,就算不崩潰,也會是長時間的運算.在呼叫了clock函式後,計算出了遞迴函式的耗時,是四個函式中最大的.而且這是個致命的缺點.時間複雜度為o(2n)(括號內為2的n次方).
2.迴圈函式演算法:這個方法需要對整個數列有一定的把握,並且能看出其中的規律,用我們班的一位同學說的"就是不停的賦值& quot;.說的很形象,這樣就是乙個迴圈的過程,每次呼叫fibo2,都會一次次迴圈,時間複雜度為o(n2)(括號內為n的平方)
3.迴圈向量函式演算法:同演算法2類似,都是以迴圈來解決問題,但是演算法3用向量先分配了一定的空間來實現,然後逐個求得向量的元素,最後得到數列的第n項值,這樣就比演算法2耗費更多的時間來進行下標操作,所以耗時比演算法2多.
4.數學公式演算法:使用乙個數學公式來進行計算,幾乎不耗什麼時間,一次運算就可以得到結果,時間和n的取值沒有太大關係,只和運算效能有關.
環境2:在檔案中讀取自變數,比較演算法2和演算法3,檔案中有一萬個資料時演算法2和演算法3耗時幾乎相同為1.7秒,但是檔案中有三萬個資料時演算法2耗時5.6秒,演算法3幾乎沒變,此時演算法3顯得更優.
(時間複雜度的解釋說明:假設某演算法的計算時間是f(n),其中變數可以是輸入或輸出量,也可以是兩者之和或者其他可以計算時間的元素,一般以運算使用次數作時間,那麼如果這個演算法在某台機器上執行時,所用的時間總是n,n2,2n,logn,n!,nm這些常量函式的乙個常數倍,那麼就說這個演算法的時間複雜度對應的是n,n2,2n,logn,n!,nm.)這些常量函式為n,n的平方,2的n次方,log n ,n的階乘,n的m次方.
如果這個演算法的時間複雜度不能跨越數量級而只是成倍數增長,比如演算法a的時間複雜度是n,演算法b的時間複雜度是2n,那麼這兩個演算法的時間複雜度都是n.在各種演算法中,o(n)表示時間複雜度為n,其他類似.
o(1)< o(logn) 斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ... 什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一... 1 題目描述 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項。斐波那契數列的定義如下 輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入包括乙個整數n 1 n 70 輸出 對應每個測試案例,輸出第n項斐波那契數列的值。2 這是九度上的乙個題,要求時間限制1秒,整數的...斐波那契數列 斐波那契數列python實現
迴圈斐波那契數列 斐波那契數列應用
斐波那契數列