日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

递归和动态规划

發(fā)布時(shí)間:2025/6/15 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归和动态规划 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

遞歸算法就是通過解決同一問題的一個(gè)或多個(gè)更小的實(shí)例來最終解決一個(gè)大問題的算法。為了在C語言中實(shí)現(xiàn)遞歸算法,常常使用遞歸函數(shù),也就是說能調(diào)用自身的函數(shù)。遞歸程序的基本特征:它調(diào)用自身(參數(shù)的值更小),具有終止條件,可以直接計(jì)算其結(jié)果。

????? 在使用遞歸程序時(shí),我們需要考慮編程環(huán)境必須能夠保持一個(gè)其大小與遞歸深度成正比例的下推棧。對(duì)于大型問題,這個(gè)棧需要的空間可能妨礙我們使用遞歸的方法。

???? 一個(gè)遞歸模型為分治法,最本質(zhì)的特征就是:把一個(gè)問題分解成獨(dú)立的子問題。如果子問題并不獨(dú)立,問題就會(huì)復(fù)雜的多,主要原因是即使是這種最簡(jiǎn)單算法的直接遞歸實(shí)現(xiàn),也可能需要難以想象的時(shí)間,使用動(dòng)態(tài)規(guī)劃技術(shù)就可以避免這個(gè)缺陷。

???? 例如,斐波那契數(shù)列的遞歸實(shí)現(xiàn)如下:

??? int F(int i)

??? {

???????????? if(i < 1)? return 0;

???????????? if(i == 1) return 1;

????????????? return F(i-1) + F(i - 2);

??? }

??? 千萬不要使用這樣的程序,因?yàn)樗男蕵O低,需要指數(shù)級(jí)時(shí)間。相比之下,如果首先計(jì)算前N個(gè)斐波那契數(shù),并把它們存儲(chǔ)在一個(gè)數(shù)組中,就可以使用線性時(shí)間(與N成正比)計(jì)算F。

?

????? F[0] = 0;F[1] = 1;

????? for(i = 2; i <= N; i++)

??????????? F[i] = F[i-1] + F[i-2];

???? 這個(gè)技術(shù)給了我們一個(gè)獲取任何遞歸關(guān)系數(shù)值解的快速方法,在斐波那契數(shù)的例子中,我們甚至可以舍棄數(shù)組,只需要保存前兩個(gè)值。

???? 由上面的討論我們可以得出這樣的結(jié)論:我們可以按照從最小開始的順序計(jì)算所有函數(shù)值來求任何類似函數(shù)的值,在每一步使用先前已經(jīng)計(jì)算出的值來計(jì)算當(dāng)前值,我們稱這項(xiàng)技術(shù)為自底向上的動(dòng)態(tài)規(guī)劃。只要有存儲(chǔ)已經(jīng)計(jì)算出的值的空間,就能把這項(xiàng)技術(shù)應(yīng)用到任何遞歸計(jì)算中,就能把算法從指數(shù)級(jí)運(yùn)行時(shí)間向線性運(yùn)行時(shí)間改進(jìn)。

??? 自頂向下的動(dòng)態(tài)規(guī)劃甚至是一個(gè)更簡(jiǎn)單的技術(shù),這項(xiàng)技術(shù)允許我們執(zhí)行函數(shù)的代價(jià)與自底向上的動(dòng)態(tài)規(guī)劃一樣(或更小),但是它的計(jì)算是自動(dòng)的。我們實(shí)現(xiàn)遞歸程序來存儲(chǔ)它所計(jì)算的每一個(gè)值(正如它最末的步驟),并通過檢查所存儲(chǔ)的值,來避免重新計(jì)算它們的任何項(xiàng)(正如它最初的步驟)。這種方法有時(shí)也稱作為備忘錄法。

?????????????????????? 斐波那契數(shù)(動(dòng)態(tài)規(guī)劃)

通過把所計(jì)算的值存儲(chǔ)在遞歸過程的外部數(shù)組中,明確地避免重復(fù)計(jì)算。這一程序計(jì)算的時(shí)間與N成正比。

????????????????? int F(int i)

????????????????? {

?

????????????????????????? if(knownF[i] != unknown)

???????????????????????????????? return knownF[i];

????????????????????????? if(i == 0) t = 0;

????????????????????????? if(i == 1) t = 1;

????????????????????????? if(i > 1)? t = F(i - 1) + F(i - 2);

???????????????????????? ?return knownF[i] = t;

????????????????? }

?

?

?????? 性質(zhì):動(dòng)態(tài)規(guī)劃降低了遞歸函數(shù)的運(yùn)行時(shí)間,也就是減少了計(jì)算所有小于或等于給定參數(shù)的遞歸調(diào)用所要求的時(shí)間,其中處理一次遞歸調(diào)用的時(shí)間為常量。

?????? 我們不需要把遞歸參數(shù)限制到單整形參數(shù)的情況。當(dāng)有一個(gè)帶有多個(gè)整形參數(shù)的函數(shù)時(shí),可以把較小子問題的解存儲(chǔ)在多維數(shù)組中,一個(gè)參數(shù)對(duì)應(yīng)數(shù)組的一維。其他那些完全不涉及整形參數(shù)的情形,就使用抽象的離散問題公式,它能讓我們把問題分解為一個(gè)個(gè)的小問題。

????? 在自頂向下的動(dòng)態(tài)規(guī)劃中,我們存儲(chǔ)已知的值;在自底向上的動(dòng)態(tài)規(guī)劃中,我們預(yù)先計(jì)算這些值。我們常常選擇自頂向下的動(dòng)態(tài)規(guī)劃而不選自底向上動(dòng)態(tài)規(guī)劃,其原因如下:

???? 1 自頂向下的動(dòng)態(tài)規(guī)劃是一個(gè)自然的求解問題的機(jī)械轉(zhuǎn)化。

???? 2 計(jì)算子問題的順序能自己處理。

???? 3 我們可能不需要計(jì)算所有子問題的解。

???? 我們不能忽視至關(guān)重要的一點(diǎn)是,當(dāng)我們需要的可能的函數(shù)值的數(shù)目太大以至于不能存儲(chǔ)(自頂向下)或預(yù)先計(jì)算(自底向上)所有值時(shí),動(dòng)態(tài)規(guī)劃就會(huì)變得低效。自頂向下動(dòng)態(tài)規(guī)劃確實(shí)是開發(fā)高效的遞歸算法實(shí)現(xiàn)的基本技術(shù),這類算法應(yīng)納入任何從事算法設(shè)計(jì)與實(shí)現(xiàn)所需的工具箱。

總結(jié)

以上是生活随笔為你收集整理的递归和动态规划的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。