日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

斐波那契数列c++代码_轮到你了,斐波那契数列!

發布時間:2023/12/10 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 斐波那契数列c++代码_轮到你了,斐波那契数列! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前陣子,日劇“輪到你了”終于大結局了,雖然結局有點一言難盡,但黑島和二階堂兩個學霸之間的愛情,還是很甜呢吶!兩個學霸之間的默契的斐波那契數列也被許多網友認為是兇手行兇的依據。到底這數列有啥神奇之處,又該如何使用代碼實現呢?一起往下看吧!斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:1,1,2,3,5,8,13,21,34,55……?我們不難發現從第三項開始,每一項都等于前兩項之和。以遞歸的方法定義就是F0=0,F1=1,Fn=Fn-1+Fn(n>=2,n∈N*)。(為了與數組下標的概念對應,F0為第0項)。通過上面的解釋,相信你對斐波那契數列有一定的了解了吧,那我們來看看今天的題目吧。今天的題目就是:當你輸入一個整數n后,輸出斐波那契數列的第n項(從0開始,第0項為0,n<=39)。腦袋里有什么想法了么?沒有的話來看看下面的三種解法吧。一、遞歸解法斐波那契數列具有天然的遞歸性,根據數學上的定義,可以得出其遞推公式為:Fn=Fn-1+Fn-2(n>=2,n∈N*),基礎情況為 F0=1,F1=1。對于遞歸解法,我們可以把問題轉化為規模縮小了的同類問題的子問題,找出明確的不需要繼續進行遞歸的條件(即基本情況base case),在本題中的基本情況為F0=0,F1=1, 當遞歸至基本情況后,無需繼續遞歸,最后把子問題的解匯聚成大問題的解。可畫遞歸樹解決遞歸問題public?class?Solution?{ public int Fibonacci(int n) { //base case if (n==0){ return 0; } if(n==1){ return 1; } return Fibonacci(n-1)+Fibonacci(n-2); }}復雜度分析:

①子問題個數,即遞歸樹中節點的總數,而二叉樹節點總數為指數級別,所以子問題個數為 O(2^n);而解決一個子問題的時間,在本算法中,沒有循環,只有 f(n - 1) + f(n - 2)f(n?1)+f(n?2) 一個加法操作,所以時間為O(1)。故我們可以得到這個算法的時間復雜度為 O(2^n),指數級別。

②而在遞歸過程中,需要在存儲遞歸過程中的運算結果,最大空間為樹的高度h(即n),而時間復雜度:O(2^n),故空間復雜度:O(h) 即O(n)問題分析:觀察遞歸樹,很明顯發現了算法低效的原因:存在大量重復計算,運算的規模與n的大小成指數關系,因此這個暴力遞歸算法雖然簡潔明了,但運行效率低下。二、動態分析由于暴力遞歸存在大量的重復運算,降低了算法的性能。所以我們可以用動態規劃方法,把運算結果存儲起來,從第0項推導至第n項,避免重復運算。我們可以先思考其暴力遞歸的解法,把暴力遞歸的過程抽象成狀態轉移方程,確定可變參數,從基本情況(base case)開始推理,通過狀態轉移方程,得出最優解,從而減少冗余運算。public class Solution { public int Fibonacci(int n) { //基本情況 if (n==0){ return 0; } if (n<=1){ return 1; } int dp[]=new int[n+1]; dp[0]=0; dp[1]=1; for(int i=2;i //狀態轉移方程 dp[i]=dp[i-1]+dp[i-2]; } return dp[n]; }}復雜度分析:??需要開辟長度為n+1的dp數組,同時遍歷整個數組,故時間復雜度為O(n),空間復雜度為O(n)。

細心的你會發現,根據斐波那契數列的狀態轉移方程,當前狀態只和之前的兩個狀態有關,其實并不需要那么長的一個 DP 數組來存儲所有的狀態,只要想辦法存儲之前的兩個狀態就行了。所以可以進一步優化,把空間復雜度降為 O(1)。

??????三、斐波那契數列通項公式?

對于這道題目,我們還可以通過斐波那契數列通項公式求解,但這個數學方法僅限于標準的斐波那契數列問題求解,無法應對斐波那契數列的變種問題。公式如下:?public class Solution { public int Fibonacci(int n) { Long fib = Math.round((Math.pow((1 + Math.sqrt(5)) / 2, n) - Math.pow((1 - Math.sqrt(5)) / 2, n)) / Math.sqrt(5)); return fib.intValue(); }}?復雜度分析:將n代入公式即可得到答案,其中Math.pow(a,b)為求a的b次方、Math.sqrt(a)為求a的正平方根、Math.round(a)為取a最接近的整數(可簡單理解為四舍五入取整).對于pow、sqrt、round方法,我們都可以放心地認為其時間復雜度為O(1),因而總的時間復雜度為O(1)。我們使用變量fib存儲運算結果,因此空間復雜度為O(1)。? ? ? ? ? ? ? ?斐波那契數列來自實現生活,有著諸多的變種問題,例如自然界中向日葵花蕊的排列線條順時針排列線條數為21,逆時針排列線條數為34,是兩個相鄰的斐波那契數;樹木也是以斐波那契數列的方式生長;而黃金比例也經常被用于藝術和建筑的設計,規劃和建造許多建筑物,如教堂,寺廟,祭壇,住房以及創造宗教藝術品。(但其實,?斐波那契數列在“輪到你了”就真的只是個數列。)

更多精彩內容:

(點擊即可閱讀)

用兩個棧實現隊列用隊列實現棧持續更新中.....后續我們還會持續更新一些有意思的算法基礎題目,有興趣的可以持續關注一下~ 信析團隊持續招新,有興趣了解的小可愛可以來科技樓232詳談哦(*?▽?*)祝祖國生日快樂!?!

總結

以上是生活随笔為你收集整理的斐波那契数列c++代码_轮到你了,斐波那契数列!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。