遞歸一直給人的感覺是簡(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è)算,看似非常傻但是卻比遞歸好用,或許這就是大智若愚吧。

比較難理解的可能是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];