动态规划学习之三种方法解决斐波拉契数
生活随笔
收集整理的這篇文章主要介紹了
动态规划学习之三种方法解决斐波拉契数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
斐波拉契數(shù)是一個很經(jīng)典的問題,也會很多公司面試的考題,每個學習計算機的同學都會接觸這個問題,尤其是在學習遞歸的時候,利用遞歸來解決斐波拉契數(shù)是很多教材采用的一個例子,所以很多同學一想到斐波拉契馬上就會采用遞歸,遞歸貌似簡單,但是效率真的很高嗎?不然!下面是我在學習動態(tài)規(guī)劃的過程中總結(jié)的集中解決斐波拉契數(shù)的不同方法:
一、最野蠻最原始的方法
[cpp]?view plaincopyprint?
這是最直接的遞歸方式,其時間復雜度為O(1.618^n),是一個指數(shù)時間級的算法,當n超過30時,你就慢慢等待吧,運氣差的話直接死機了。
二、自底向上的動態(tài)規(guī)劃方法
我們已知F(0)和F(1)的值,則我們從F(2)開始就可以利用前面兩個已經(jīng)計算出來的值,這樣從小到大就可以最終求出F(n)
[cpp]?view plaincopyprint?
其時間復雜度已經(jīng)從指數(shù)級降到線性級O(n)了,空間復雜度為O(1)
三、自頂向下的動態(tài)規(guī)劃方法
這種方法也是采用遞歸的思想,但是確應用了動態(tài)規(guī)劃的原理:將以前的計算結(jié)果存儲起來備用,這樣在以后出現(xiàn)同樣的問題時就不用重復計算。也叫備忘錄方法。
[cpp]?view plaincopyprint?
自頂向下的動態(tài)規(guī)劃遞歸方法大大減少了遞歸調(diào)用的次數(shù),避免了重復遞歸計算,其算法時間復雜度也為線性級,其關(guān)鍵就是能夠"保存已經(jīng)計算過的子問題的結(jié)果".
總結(jié)
以上是生活随笔為你收集整理的动态规划学习之三种方法解决斐波拉契数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫谈递归:从斐波那契开始了解尾递归
- 下一篇: Python 列表(List)操作方法详