本篇文章我將和大家分享Java遞歸應(yīng)用中一個(gè)經(jīng)典問(wèn)題,斐波那契數(shù)列兔子問(wèn)題。相信很多初學(xué)遞歸的小伙伴,遇到這個(gè)問(wèn)題都會(huì)有一些暈頭轉(zhuǎn)向的。下面,我將為大家詳細(xì)講解Java中關(guān)于兔子問(wèn)題的遞歸應(yīng)用。
一、題目介紹
題目?jī)?nèi)容:
現(xiàn)在有一對(duì)小兔子,它們需要三個(gè)月的時(shí)間才能長(zhǎng)成大兔子,同時(shí)還會(huì)產(chǎn)下一對(duì)小兔子。假設(shè)兔子們都不會(huì)死,那么請(qǐng)問(wèn),在三年后,一共會(huì)有多少只兔子呢?
題目分析:
許多小伙伴看到這樣的題目,估計(jì)已經(jīng)開(kāi)始暈頭轉(zhuǎn)向了。不用著急,接下來(lái)我們先慢慢分析一下這個(gè)問(wèn)題,找到問(wèn)題里面所在的規(guī)律。
第1個(gè)月 1 0 0 1對(duì)兔子 2只兔子
第2個(gè)月 0 1 0 1對(duì)兔子 2只兔子
第3個(gè)月 1 0 1 2對(duì)兔子 4只兔子
第4個(gè)月 1 1 1 3對(duì)兔子 6只兔子
第5個(gè)月 2 1 2 5對(duì)兔子 10只兔子
第6個(gè)月 3 2 3 8對(duì)兔子 16只兔子
第7個(gè)月 5 3 5 13對(duì)兔子 26只兔子
第8個(gè)月 8 5 8 21對(duì)兔子 42只兔子
……
看到這里,不知道小伙伴們有沒(méi)有發(fā)現(xiàn)里面規(guī)律?
從第三個(gè)月開(kāi)始,兔子的總對(duì)數(shù)是前面兩個(gè)月的總和。
3月 1月的數(shù)量+2月的數(shù)量 1+1 2
4月 2月的數(shù)量+3月的數(shù)量 1+2 3
5月 3月的數(shù)量+4月的數(shù)量 2+3 5
可以得到這樣一個(gè)數(shù)學(xué)公式? sum = n(x-1)+n(x-2)[x>2];
?
二、代碼展示
題目要求是三年后,一共有多只兔子。因此,先聲明一個(gè)36位的數(shù)組,用來(lái)遍歷。
因?yàn)榈谝粋€(gè)月和第二個(gè)月都只有一對(duì)兩只,因此加入判斷,如果是第一個(gè)月或者第二個(gè)月,那么加入相應(yīng)位置的數(shù)值是1.
繼續(xù)判斷第三個(gè)月后,開(kāi)始進(jìn)行前兩個(gè)月的累加。具體代碼如下:
public class Demo01 {
/**
* 經(jīng)典兔子問(wèn)題
* 遞歸 斐波那契數(shù)列
* */
public static void main(String[] args) {
int i;
int[] arr=new int[36];
for(i=0;i<arr.length;i++){
if(i==0 || i==1){
arr[i] = 1;
System.out.println("第"+(i+1)+"個(gè)月有"+2*arr[i]+"只兔子");
}else{
arr[i] = arr[i-1] + arr[i-2];
System.out.println("第"+(i+1)+"個(gè)月有"+2*arr[i]+"只兔子");
}
}
}
}
打印結(jié)果:
可以看到,我們最后得到的數(shù)量可以說(shuō)是非常之龐大。這里要說(shuō)一個(gè),就是遞歸雖好,代碼少,簡(jiǎn)單直觀。但是在項(xiàng)目中不建議使用,如果遞歸的深度太深了,會(huì)導(dǎo)致系統(tǒng)崩潰的。
三、總結(jié)
以上就是關(guān)于 Java 遞歸實(shí)現(xiàn)斐波那契數(shù)列,經(jīng)典兔子問(wèn)題的全部?jī)?nèi)容,想要了解更多關(guān)于 Java 遞歸的其他內(nèi)容,可以搜索W3Cschool中相關(guān)技術(shù)文章閱讀,也希望大家能夠多多關(guān)注和支持!