遞歸算法的弊端與改進(jìn)

遞歸一直給人的感覺是簡(jiǎn)潔且優(yōu)雅,但是在面對(duì)較大規(guī)模的問題時(shí),遞歸的弊端就漸漸暴露出來了。因?yàn)榇罅織5氖褂脤?dǎo)致程序運(yùn)行速度變得很慢,所以遞歸算法需要改進(jìn)。

1.尾遞歸:函數(shù)返回之前的最后一個(gè)操作若是遞歸調(diào)用,則該函數(shù)進(jìn)行了尾遞歸。

但是我發(fā)現(xiàn)尾遞歸貌似并沒有很顯著的作用???(值得深究)

2.遞歸改遞推,舉例斐波拉切數(shù)列


遞歸算法大于40之后就會(huì)變得很慢,甚至算不出來。而遞推算法可以算更大的數(shù)而且算得更快(即使用了long,但是超過50還是會(huì)溢出gg)。

所以面額拼湊問題就需要使用遞推法,一個(gè)一個(gè)算,看似非常傻但是卻比遞歸好用,或許這就是大智若愚吧。

可以算10000的遞推算法

比較難理解的可能是m[j]+=m[j-den[i]];其等價(jià)于之前提到的遞推式(1020,100)=(1020-100,100)+(1020,50),但是我們發(fā)現(xiàn)(1020,50)沒了,這是因?yàn)橹耙呀?jīng)加上去了。

在這個(gè)兩層循環(huán)中,第一層就是以不同的面額做循環(huán),例如(5,5)=(0,5)+(5,1),之所以省略掉了(5,1)是因?yàn)樵谥熬鸵呀?jīng)將(5,1)加上去了(m[j]=1),所以可以直接m[j]+=m[j-den[i]].當(dāng)面額為5循環(huán)完畢之后,就可以開始面額為10的循環(huán)了。(10,10)=(5,10)+(10,1)=(5,5)+(10,1),由于之前(10,1)已經(jīng)加上去了,所以直接加上(5,5)就可以了。一次類推直到面額100循環(huán)完畢,結(jié)果就出來了。(感覺沒有講清楚)

碰到的問題:

1.10000的時(shí)候出現(xiàn)溢出。原因:之前在intellij(java)中寫的時(shí)候用long(64位)沒問題,但是C語(yǔ)言(dev c++和VS)long是32位的,所以使用long long

2.dev c++使用的是gcc編譯器支持動(dòng)態(tài)數(shù)組,VS不支持所以一開始報(bào)錯(cuò)。改為long long *m=new long long[money+1];

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • “月有陰晴圓缺,人有悲歡離合?!?生活就是不斷地在變化,有風(fēng)有雨,有熱有寒,太多人在無法預(yù)測(cè)的世界里失去幸福。正是...
    RocToken閱讀 435評(píng)論 0 0
  • 電影院放的電影有點(diǎn)無聊,此時(shí)不揩油更待何時(shí)?!我故意把頭一歪,倒在他的肩膀上,他沒動(dòng)。我閉上眼打算睡覺,但電影躍動(dòng)...
    七逾茝Alice閱讀 156評(píng)論 0 0
  • 001 黃昏莫回頭“蠻,蠻,蠻……”暑假的清晨,本應(yīng)該是很美好的,可以睡一個(gè)很長(zhǎng)很長(zhǎng)的覺,但是,整個(gè)暑假,單蠻...
    蘇西泠閱讀 360評(píng)論 0 0
  • Laravel 提供 Artisan 命令行工具讓你使用 generators 去節(jié)省時(shí)間。 比如我們熟悉的 ma...
    purewater2014閱讀 260評(píng)論 0 0
  • 文/妖精婆婆 父親去世后,我情緒低落,患上了兩種?。撼掷m(xù)性焦慮和間歇性抑郁,沒有病入膏盲,但也絕對(duì)不輕。 “十一”...
    8207944d9693閱讀 740評(píng)論 44 45

友情鏈接更多精彩內(nèi)容