六大算法之動(dòng)態(tài)規(guī)劃 遞歸算法和動(dòng)態(tài)規(guī)劃的關(guān)系是什么呀?
遞歸算法和動(dòng)態(tài)規(guī)劃的關(guān)系是什么呀?遞歸方法是算法本身的調(diào)用,動(dòng)態(tài)規(guī)劃是把一個(gè)問(wèn)題分解成幾個(gè)子問(wèn)題,把大問(wèn)題的解分解成子問(wèn)題的解。動(dòng)態(tài)規(guī)劃有時(shí)可以通過(guò)遞推來(lái)實(shí)現(xiàn),遞推通常用于求解優(yōu)化問(wèn)題。C語(yǔ)言中的遞歸
遞歸算法和動(dòng)態(tài)規(guī)劃的關(guān)系是什么呀?
遞歸方法是算法本身的調(diào)用,動(dòng)態(tài)規(guī)劃是把一個(gè)問(wèn)題分解成幾個(gè)子問(wèn)題,把大問(wèn)題的解分解成子問(wèn)題的解。動(dòng)態(tài)規(guī)劃有時(shí)可以通過(guò)遞推來(lái)實(shí)現(xiàn),遞推通常用于求解優(yōu)化問(wèn)題。
C語(yǔ)言中的遞歸程序可以用非遞歸算法實(shí)現(xiàn)嗎?
是的,所有遞歸都可以用循環(huán)和堆棧等價(jià)重寫(xiě)。
如何將C語(yǔ)言的遞歸學(xué)好?
老實(shí)說(shuō),除了貪心算法,動(dòng)態(tài)規(guī)劃等算法使用遞歸更容易,最好不要使用遞歸。首先,遞歸代價(jià)太高。其次,C語(yǔ)言是一種過(guò)程語(yǔ)言,它是自上而下一步一步地執(zhí)行的,因此使用迭代可以更好地理解邏輯。如果你堅(jiān)持學(xué)習(xí)遞歸的藝術(shù)(是的,好的遞歸是藝術(shù)的體現(xiàn)),學(xué)習(xí)函數(shù)式語(yǔ)言。建議使用LISP。
如何理解遞歸,回溯,動(dòng)態(tài)規(guī)劃等算法?
遞歸比較簡(jiǎn)單,是遞歸的逆算法。例如,給定a(10)和a(n)=f(a(n1)),讓您找到a(1)。回溯是一種必須用于深度優(yōu)先搜索的方法。建議大家看一看“八皇后問(wèn)題”,看完后要理解。動(dòng)態(tài)規(guī)劃是一種以空間換時(shí)間的算法,即占用大量?jī)?nèi)存,但具有較高的時(shí)間效率。建議你看看“攔截導(dǎo)彈”問(wèn)題和“0/1背包問(wèn)題”。先看動(dòng)態(tài)規(guī)劃的問(wèn)題,再了解概念比較好
遞歸,簡(jiǎn)單重復(fù),計(jì)算量大。分而治之,獨(dú)立解決問(wèn)題,分而治之,顧名思義。動(dòng)態(tài)規(guī)劃算法通常采用自下而上的方法求解每個(gè)子問(wèn)題,而貪婪算法通常采用自上而下的方法求解子問(wèn)題,動(dòng)態(tài)規(guī)劃可以找到問(wèn)題的最優(yōu)解,但是貪心不能保證問(wèn)題的最優(yōu)解
memo方法是動(dòng)態(tài)規(guī)劃方法的一種變形。與動(dòng)態(tài)規(guī)劃算法不同,memo方法的遞推方式是自頂向下的,而動(dòng)態(tài)規(guī)劃算法是自下而上的。例如:LCS問(wèn)題:當(dāng)席= YJ,C[I,J]只需要知道C[I-1,J-1 ],而不是C[I,0 ]~C[I,J-1 ]和C[I-1,J]~C[I-1,N]。當(dāng)只需要一個(gè)LCS時(shí),一些C[P,q]可能不會(huì)在整個(gè)溶液過(guò)程中使用。一般情況下,當(dāng)一個(gè)問(wèn)題可以用動(dòng)態(tài)規(guī)劃來(lái)求解時(shí),二維數(shù)組中相當(dāng)數(shù)量的元素不會(huì)用到整個(gè)計(jì)算中。我們不需要遞歸地逐個(gè)計(jì)算二維數(shù)組中的元素。使用memo方法:數(shù)組中的元素只在需要計(jì)算時(shí)才計(jì)算,并且計(jì)算是遞歸的。計(jì)算完這些值后,將保存這些值以用于其他目的。例如:LCs的問(wèn)題:首先,將C[I,0](0≤I≤m)和C[0,J](1≤J≤n)初始化為0。其余的m×nc[I,J]都初始化為-1。計(jì)算C[I,J]L2(x,y,I,J,C)的遞歸算法LCS(memo方法):如果x[I]=y[J],檢查C[I-1,J-1],如果C[I-1,J-1]>-1(計(jì)算),將C[I-1,J-1]1賦值給C[I,J],并返回。如果C[I-1,J-1]=-1(尚未計(jì)算),則遞歸調(diào)用LCS L2(x,y,I-1,J-1,C)計(jì)算C[I-1,J-1],然后將C[I-1,J-1]1賦給C[I,J],并返回。如果x[i]1,y[J],檢查C[i-1,J]和C[i,J-1]。如果兩者都大于-1(已計(jì)算),則將Max{C[I-1,J],C[I,J-1]}賦給C[I,J],并返回。如果C[I-1,J],C[I,J-1]中的一個(gè)等于-1(尚未計(jì)算),或者兩者都等于-1,則遞歸調(diào)用LCS,L2計(jì)算它,然后將Max{C[I-1,J],C[I,J-1]}賦值給C[I,J]。如果大量的子問(wèn)題不需要解決,memo方法可以節(jié)省時(shí)間。但是當(dāng)只需要計(jì)算少數(shù)或全部子問(wèn)題時(shí),遞歸方法比memo方法(如矩陣乘法、最優(yōu)二叉搜索樹(shù))要好