但要注意的是遞歸寫(xiě)起來(lái)簡(jiǎn)潔,但實(shí)際上執(zhí)行的效率并不高。
我們?cè)倏纯磩?dòng)態(tài)規(guī)劃的算法:
動(dòng)態(tài)規(guī)劃解決方案從底部開(kāi)始解決問(wèn)題, 將所有小問(wèn)題解決掉, 然后合并成一個(gè)整體解決方案, 從而解決掉整個(gè)大問(wèn)題 。
實(shí)例舉例 (計(jì)算斐波那契數(shù)列)
斐波那契數(shù)列指的是這樣一個(gè)數(shù)列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
這個(gè)數(shù)列從第3項(xiàng)開(kāi)始,每一項(xiàng)都等于前兩項(xiàng)之和。
針對(duì)這個(gè)數(shù)列,可以用一個(gè)遞歸的函數(shù)去計(jì)算第n項(xiàng) 數(shù)值
確實(shí)是個(gè)非常簡(jiǎn)潔的代碼,上面有被注釋的代碼 ,是用來(lái)打印出當(dāng)n=多少,要執(zhí)行多少次函數(shù),不過(guò)明眼人一眼就能看出來(lái)執(zhí)行的次數(shù)隨著n的變大,次數(shù)也會(huì)非常恐怖增長(zhǎng)。
當(dāng)n=5的時(shí)候,遞歸樹(shù)已經(jīng)長(zhǎng)的很大了……可以預(yù)見(jiàn)當(dāng)n=10,甚至n=100的時(shí)候……
明白了遞歸函數(shù)執(zhí)行效率之差,我們?cè)賮?lái)看的動(dòng)態(tài)規(guī)劃是如何做的
通過(guò)數(shù)組 val 中保存了中間結(jié)果, 如果要計(jì)算的斐波那契數(shù)是 1 或者 2, 那么 if 語(yǔ)句會(huì)返回 1。 否則,數(shù)值 1 和 2 將被保存在 val 數(shù)組中 1 和 2 的位置。
循環(huán)將會(huì)從 3 到輸入的參數(shù)之間進(jìn)行遍歷, 將數(shù)組的每個(gè)元素賦值為前兩個(gè)元素之和, 循環(huán)結(jié)束, 數(shù)組的最后一個(gè)元素值即為最終計(jì)算得到的斐波那契數(shù)值, 這個(gè)數(shù)值也將作為函數(shù)的返回值。
接下來(lái)可以寫(xiě)個(gè)簡(jiǎn)單的測(cè)試函數(shù),來(lái)對(duì)比兩者的運(yùn)行時(shí)間。
打印函數(shù)執(zhí)行
結(jié)果如下:
最后, 你或許已經(jīng)意識(shí)到在使用迭代的方案計(jì)算斐波那契數(shù)列時(shí), 是可以不使用數(shù)組的。
需要用到數(shù)組的原因是因?yàn)閯?dòng)態(tài)規(guī)劃算法通常需要將中間結(jié)果保存起來(lái)。
以下是迭代版本的斐波那契函數(shù)義
當(dāng)然這個(gè)迭代版本的與數(shù)組的版本的效率也是相同的。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com