信任小伙伴們都有聽說過斐波那契數(shù)列。這個著名的數(shù)列也叫“兔子數(shù)列”。
沒聽說的話也沒關(guān)系,咱們一起來探究一下所謂的兔子數(shù)列。
話說我家兔子在出世兩個月后,就有了繁衍能力可以生下小兔子。假設(shè)一對有繁衍力的兔子每個月能生出一對小兔子(一雄一雌)來。假如一年后所有兔子都不死,那么我家剛出世的一對小兔子一年以后可以繁衍多少只兔子?
這是個風(fēng)趣的問題。依照推算,咱們可以得到這樣的一組數(shù)列:0、1、1、2、3、5、8、13、21、34……
咱們分析得知:3月=2月+1月;4月=3月+2月……12月=11月+10月。
所以咱們最終得到12月=11月+10月=10月+9月+10月=……
那么運用java,怎樣寫出這個算法呢?如圖:
咱們界說一個辦法m,該辦法入?yún)⑹窃路?,出參是該月出世的兔子的對?shù)。咱們想得到12月出世多少對兔子,所以調(diào)用該辦法應(yīng)該是:m(12);咱們知道每個月出世的兔子為上兩個月之和,于是m(12)辦法的主要邏輯是m(11)+m(10);也就是代碼中的:
inti=m(month-1)+m(month-2);
然后在該代碼中又調(diào)用了兩次m辦法,分別傳入前兩個月的月份,由此m(month-1)和m(month-2)又可以再次拆分??墒沁@樣拆分的話,會出現(xiàn)死循環(huán)。所以,咱們必須要跳出循環(huán)。咱們必須讓拆分在某個月得到詳細(xì)的成果,不再進行辦法自己內(nèi)部調(diào)用自己,這樣就可以計算出成果了。
這種通過反復(fù)自調(diào)用來解決問題的思想叫做遞歸。
有些互聯(lián)網(wǎng)公司在面試時,會經(jīng)常出一些相似的筆試題。比方經(jīng)典的山公吃桃的問題:山公有一樹桃子,每天吃掉桃子總數(shù)的一半,可是不過癮,又多吃掉一個。到了第十天,樹上還剩下一個桃子。那么第一天樹上原始的桃子數(shù)量是多少?
這一題咱們本次不做討論,留給小伙伴們自己去用代碼實現(xiàn)。下一篇文章里咱們會給出代碼。
剖析:首先咱們要明白標(biāo)題的意思指的是每個月的兔子總對數(shù);假設(shè)將兔子分為小中大三種,兔子從出世后三個月后每個月就會生出一對兔子,
那么咱們假定榜首個月的兔子為小兔子,第二個月為中兔子,第三個月之后就為大兔子,那么榜首個月分別有1、0、0,第二個月分別為0、1、0,
第三個月分別為1、0、1,第四個月分別為,1、1、1,第五個月分別為2、1、2,第六個月分別為3、2、3,第七個月分別為5、3、5……
兔子總數(shù)分別為:1、1、2、3、5、8、13……
所以得出了一個規(guī)則,從第三個月起,后面的兔子總數(shù)都等于前面兩個月的兔子總數(shù)之和,即為斐波那契數(shù)列。
publicclassTest{
publicstaticvoidmain(String[]args){
inti=1;
for(i=1;i<=20;i++){
System.out.println(“兔子第”+i+”個月的總數(shù)為:”+f(i));
}
}
publicstaticintf(intx){
if(x==1||x==2){
return1;
}else{
returnf(x-1)+f(x-2);
}
}
}
從1到100相加:
publicclassDigui{
publicintsum(inti){
if(i==1){
return1;
}
returni+sum(i-1);
}
publicstaticvoidmain(String[]args){
Diguitest=newDigui();
System.out.println(“核算結(jié)果:”+test.sum(100)+”!”);
}
}
從1到100階乘:
需求留意的是核算后的結(jié)果數(shù)值過大程序無法回來,一般狀況會回來0!那么用int、long是無法滿足的,所以要用BigInteger
publicclassDigui{
publicBigIntegersum(inti){
if(i==1){
returnBigInteger.ONE;
}
returnBigInteger.valueOf(i).multiply(sum(i-1));
}
publicstaticvoidmain(String[]args){
Diguitest=newDigui();
try{
System.out.println(“核算結(jié)果:”+test.sum(50)+”!”);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
別的提別提醒下真實項目中要穩(wěn)重運用遞歸算法,大致總結(jié)下遞歸算法的優(yōu)缺點:
長處:
代碼更簡練明晰,可讀性更好
缺點:
由于遞歸需求系統(tǒng)堆棧,所以空間耗費要比非遞歸代碼要大很多。并且,如果遞歸深度太大,可能系統(tǒng)撐不住。
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號新時空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號