寫乙個生成斐波那契數列的程式,初學計算機遲早會寫那麼一次,至少看過別人的**一次。
一、小鳥層次
int fibonacci_a(int n)
其實我相信100個程式設計師裡面有80個能寫出這樣乙個程式。事實這確實不是個什麼複雜的函式,看了數學公式,然後心安理得地寫出這樣乙個程式,或者從課本上看到這樣乙個程式,然後敲上一遍,許多人會認為至少斐波那契數列的生成算是掌握了。但如果他呼叫一下fibonacci_a(1000),我覺得他多半是沒法在吃晚飯前等到結果了。所以這是乙個菜鳥程式,或許程式設計師並不是菜鳥,但至少在這個程式上是菜鳥。
二、高手層次
int fibonacci_b(int n)
如果知道這樣也可以完成斐波那契數列的生成,至少應該是個高手了。這是乙個典型的空間換取時間的例子。如果知道自己用的是動態規劃技術,那麼無疑更好了。你可以安心地呼叫fibonacci(10000),很慢的機子應該也能瞬間得到結果。但似乎還是有點美中不足,new有點耗時間,空間耗費也很大。
三、完美主義者
int fibonacci_c(int n)
; for( ; n>2; n-=3 )
arr[0] = arr[1] + arr[2],
arr[1] = arr[0] + arr[2],
arr[2] = arr[0] + arr[1];
return arr[n];
}
仔細觀察後,你會發現其實許多前面的運算結果是可以不保留的,那麼三個臨時空間就足夠。速度比上乙個版本還要快,空間到了完全可以接受的程度。極限主義者發現其實還可以進一步縮減到只用兩個臨時空間,但速度會變慢(為什麼?判斷次數多了),數學理論上有直接的公式,是否更快呢?因為涉及到乘法,其實並不能加快運算,就算使用快速乘法技術(n次方只需要log n 次乘法),依然會遇到精度問題,而且**變得並不通俗易懂。那麼乙個完美主義者也可以接受這個版本了,時間複雜度優秀,空間複雜度優秀,**沒有精度問題可能導致的錯誤,**簡潔。c++中有模板元程式設計可以直接生成需要的斐波那契數,而且幾乎不費程式時間(編譯時間在n大的時候和第乙個版本一樣恐怖),但卻要求n只能是常數。好了,你擁有乙個完美主義者應該有的斐波那契數生成版本了。
事實上還有乙個更加優美的o( logn )版本的演算法,在後續的部落格中給出。
什麼是好的**?好的效能(時間複雜度),好的記憶體占用(盡量少),沒有錯誤(盡量),**簡潔(至少保證自己半年還能讀懂),知道尺度(不過於追求某些工程上極限技術,而更樂於本質的創新)。然後寫好下一段**!你寫得最好的**是什麼?下一段!
斐波那契數列 斐波那契數列python實現
斐波那契數列 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秒,整數的...