龔老師的電腦最近脾氣很大,因?yàn)樽罱铱傋屗雒杜e算法,可把它累壞了。枚舉算法大家還記得吧,先來(lái)復(fù)習(xí)一下找找為什么電腦脾氣這么大!枚舉算法設(shè)計(jì)模式:1.分析題目,確定可解的范圍。2.設(shè)計(jì)循環(huán)結(jié)構(gòu),包括循環(huán)次數(shù)和判斷條件,在循環(huán)體內(nèi)對(duì)可能解逐一判定,直至求出問(wèn)題解。3.為了提高解決問(wèn)題的效率,使可能解的范圍降至最小。注意,小心電腦罷工!
注意小心電腦罷工!看來(lái)我的電腦最近在琢磨著罷工了,得學(xué)習(xí)個(gè)新的算法來(lái)緩解下電腦壓力了!枚舉算法是個(gè)值得我們每個(gè)人都學(xué)習(xí)的持之以恒的好同學(xué),但有時(shí)候顯的不夠聰明,今天我們來(lái)認(rèn)識(shí)“聰明”點(diǎn)的算法——遞推算法。
遞推算法青出于藍(lán)而勝于藍(lán),繼承了枚舉算法持之以恒的精神,又取巧的先來(lái)找一找規(guī)律。遞推算法以“起點(diǎn)”為基礎(chǔ),運(yùn)用相同的運(yùn)算規(guī)則,逐次重復(fù)運(yùn)算,直至得出結(jié)論、運(yùn)算結(jié)束。聰明的你想一想,如果以“終點(diǎn)”為基礎(chǔ),依照運(yùn)算規(guī)則重復(fù)運(yùn)算,算不算遞推算法呢?遞推算法分兩種模式,一:順推。從已知條件開(kāi)始,逐步推算出問(wèn)題的解。二:逆推。現(xiàn)在知道剛才的答案了吧?算,遞推算法,還時(shí)逆推算法。
遞推算法設(shè)計(jì)模式:1.分析題目已知條件和結(jié)果之間的聯(lián)系【例如,1,1,2,3,5,8? 找出聯(lián)系了嗎?】。2.設(shè)計(jì)循環(huán)結(jié)構(gòu),包括循環(huán)次數(shù)和判斷條件,在循環(huán)體內(nèi)對(duì)可能解逐一判定,直至求出問(wèn)題解。
頭昏腦漲的同學(xué)估計(jì)要說(shuō):好了說(shuō)得那么厲害,那這玩意到底干啥的?遞推算法在數(shù)學(xué)各個(gè)領(lǐng)域中都被廣泛的運(yùn)用著,我們來(lái)看個(gè)實(shí)例吧。【今天來(lái)點(diǎn)簡(jiǎn)單的開(kāi)胃菜!】
小試牛刀:
滿足F1=F2=1,Fn=Fn-1+Fn-2的數(shù)列我們叫做斐波那契數(shù)列,(Fibonacci)它的前若干項(xiàng)是:1,1,2,3,5,8,13,21,34…求此數(shù)列的第n項(xiàng)。
小提示:題目意圖是讓我們輸入一個(gè)數(shù),讓電腦幫我們?cè)陟巢瞧鯏?shù)列中找到那個(gè)位置上的數(shù)字。【例如我輸入4,電腦會(huì)把斐波那契數(shù)列中第四個(gè)數(shù)字3輸出來(lái)。】既然要在斐波那契數(shù)列中找數(shù)字,第一步得研究出這個(gè)數(shù)列有什么規(guī)律吧?斐波那契數(shù)列?聽(tīng)起來(lái)就像某個(gè)數(shù)學(xué)大師來(lái)折騰我們的的杰作。據(jù)說(shuō)遞推算法這功夫在數(shù)學(xué)世界中游奇效?
1.解法分析:
遞推算法設(shè)計(jì)模式:1.分析題目已知條件和結(jié)果之間的聯(lián)系。已知條件:【1,1,2,3,5,8,13,21,34…】,規(guī)律顯而易見(jiàn),從第三個(gè)數(shù)字開(kāi)始,前兩個(gè)數(shù)字之和等于第三個(gè)數(shù)字【例如:3+5=8,5+8=13,8+13=21】。我們先把數(shù)字列出來(lái),第一個(gè)數(shù)字:f1,第二個(gè)數(shù)字:f2,第三個(gè)數(shù)字:f3。f3=f1+f2【f1+f2的值,賦值給f3。】第一個(gè)加法式子搞定了,再來(lái)研究第二個(gè)式子,姑且把第四個(gè)數(shù)字叫為:f4,f4=f2+f3。看起來(lái)也對(duì),可是之后的第五個(gè)數(shù)字,第六個(gè)數(shù)字都需要f5,f6....嗎?明顯是不合理的,電腦可不希望你這么無(wú)知的分配空間。
那么回看看,剛剛f3=f1+f2之后,f1還有用嗎?第四個(gè)數(shù)字是第三和第二數(shù)相加,其實(shí)至始至終都只用了3個(gè)數(shù)字,那么我們拿3個(gè)變量來(lái)存放這3個(gè)數(shù)字就ok了,何必要F5,F(xiàn)6呢?
2.代碼實(shí)現(xiàn)
聰明的你搞定了沒(méi)?
3.代碼詳解:
運(yùn)用遞推算法首先要研究出一串?dāng)?shù)字間的規(guī)律,我們確定規(guī)律發(fā)現(xiàn)只需要3個(gè)變量來(lái)存放不斷變換的數(shù)字,那么首先來(lái)3個(gè)變量,f1, f2, f3。按題目要求,我們手動(dòng)輸入n的值,告訴電腦我們需要輸出第n個(gè)位置上的數(shù)。既然第n個(gè)位置,那么循環(huán)找起來(lái)吧,從第一個(gè)位置找還是從第三個(gè)位置找?
第一,第二數(shù)為1,從第三數(shù)開(kāi)始符合規(guī)律,當(dāng)然是從第3個(gè)位置開(kāi)始,至少三個(gè)數(shù)才符合我們發(fā)現(xiàn)的規(guī)律:f3=f1+f2,既然f1, f2已經(jīng)用完了,首先把f2的值存放到f1之內(nèi),反正f1的數(shù)字已經(jīng)沒(méi)用了【好好理解這部分!】。接著把f3的值放到f2之內(nèi),反正f2的值已經(jīng)放到了f1內(nèi)。【好好理解這部分!】。
按照我們安排的規(guī)律,循環(huán)我們要找到的第n個(gè)位置,那么乖乖輸出正確答案吧。
4.代碼升級(jí):
別高興太早,嚴(yán)謹(jǐn)?shù)膽B(tài)度才能讓你顯得更靠譜哦!讓程序輸出第一個(gè)位置,第二個(gè)位置看看?EXM?電腦似乎瘋了?找一找哪里有問(wèn)題呢?
通過(guò)某個(gè)已觀察出的條件,利用特定規(guī)律得出中間推論,然后逐步遞推直至得出結(jié)論。遞推算法可是在數(shù)學(xué)世界中有著舉足輕重的地位,你學(xué)會(huì)了嗎?