java語(yǔ)言求解兔子問題代碼分析
1、思考
兔子問題,是費(fèi)氏數(shù)列的形象化說法,它是由一位名為Fibonacci的數(shù)學(xué)家在它的著作中提出的一個(gè)問題。
2、描述
它體術(shù)的問題是:若有一只免子每個(gè)月生一只小免子,一個(gè)月后小免子也開始生產(chǎn)。起初只有一只免子,一個(gè)月后就有兩只免子,二個(gè)月后有三只免子,三個(gè)月后有五只免子(小免子投入生產(chǎn))......
我們使用數(shù)學(xué)的方式表達(dá)出來(lái),便是下面的一組數(shù)列:
1、1、2、3、5、8、13、21、34、55、89......
注意:新生的小免子需一個(gè)月成長(zhǎng)期才會(huì)投入生產(chǎn)!而且這些兔子是不死的哦?。。?/p>
3、規(guī)律
當(dāng)我們莫名其妙的接觸到這個(gè)問題的時(shí)候,很難找到其中的規(guī)律,但是依照數(shù)學(xué)中數(shù)列的規(guī)律去思考這個(gè)問題,等比?等差?還是其它什么?既然這是一個(gè)由數(shù)學(xué)家提出的問題,那么其中應(yīng)該有一定的數(shù)學(xué)規(guī)律吧?到底是什么規(guī)律呢,仔細(xì)分析上面的一組數(shù)列,相比你已經(jīng)有了答案了。沒錯(cuò),它用一句話來(lái)表述,從第三項(xiàng)開始,前面兩項(xiàng)的和等于第三項(xiàng)。
假設(shè)第n項(xiàng)的數(shù)值為fn,那么該數(shù)列的規(guī)律性使用數(shù)學(xué)公式表達(dá)如下:
4、偽代碼
所謂偽代碼,就是不是真的代碼,它并不能在機(jī)器上執(zhí)行,只是一段介于自然語(yǔ)言和編程語(yǔ)言之間的一種表達(dá)程序邏輯的有意義的符號(hào)。對(duì)于兔子問題的偽代碼,我們這里使用上述公式的遞歸方式,可以有以下的偽代碼:
Procedure FIB(N) [
IF (N < 0)
PRINT ("輸入錯(cuò)誤");
IF (N = 0 OR N = 1)
RETURN (N);
ELSE
RETURN ( FIB(N-1) + FIB(N-2) );
]
根據(jù)之前文章所描述的遞歸概念,詳細(xì)情況可以參考之前的《漢諾塔問題》,相比大家對(duì)遞歸已經(jīng)不會(huì)太陌生,那么根據(jù)上述我們得到的數(shù)學(xué)公式,推演出這樣的遞歸偽代碼,會(huì)非常簡(jiǎn)潔明了。但是,額,可能大家猜到了,我要說但是。大家是否發(fā)現(xiàn)一個(gè)問題,當(dāng)我們的n值過大的時(shí)候,程序會(huì)比較慢?
如果你發(fā)現(xiàn)了,說明你認(rèn)真思考了這個(gè)問題,相比你也應(yīng)該解決了心中的疑惑。如果還有沒有解決疑惑的,就隨著我來(lái)解決大家的疑惑。為什么會(huì)比較慢呢?原因在于,當(dāng)我們計(jì)算后面的第n項(xiàng)的時(shí)候,需要再次計(jì)算n-1和n-2項(xiàng),而這兩項(xiàng)在之前都是已經(jīng)被計(jì)算過了的,我們?cè)偾蠛竺娴囊粋€(gè)數(shù)的時(shí)候,還是要在計(jì)算一邊,無(wú)形之中,我們就多做了很多無(wú)用功。
那么,我們時(shí)候有好的方法去解決這個(gè)問題呢?答案是有的。根據(jù)上面的分析,當(dāng)我們?cè)谇蠼獾趎項(xiàng)的時(shí)候,前面n-1和n-2項(xiàng)是已經(jīng)求解過的,那么,為什么我們不把它存起來(lái)呀????
哈哈,有沒有瞬間豁然開朗,對(duì)呀!我們這里是使用空間換時(shí)間,可以大大提高效率哦!這里我就不寫偽代碼了。
5、代碼
好了,關(guān)子賣完了,直接上代碼:
public class Fibonacci {
public static void main(String[] args) {
int[] fib = new int[20];
fib[0] = 0;
fib[1] = 1;
for(int i = 2; i < fib.length; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
for(int i = 0; i < fib.length; i++){
System.out.print(fib[i] + " ");
}
System.out.println();
}
}
6、思考
這里,我們提出一個(gè)思考題,如果兔子它不是生一個(gè)兔子,生多個(gè)兔子,該怎么求解?當(dāng)然,我們說的生多個(gè)就是定數(shù),不會(huì)一個(gè)兔子生得多,一個(gè)兔子生的少,不然那樣就沒法求解了。
這里就不上代碼了,大家可以自己在網(wǎng)上查找一下合適的資源,看看如何求解。
總結(jié)
以上就是本文關(guān)于Java語(yǔ)言求解兔子問題代碼分析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出!
相關(guān)文章
基于Java反射技術(shù)實(shí)現(xiàn)簡(jiǎn)單IOC容器
這篇文章主要介紹了基于Java反射技術(shù)實(shí)現(xiàn)簡(jiǎn)單IOC容器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
解決Spring boot 嵌入的tomcat不啟動(dòng)問題
這篇文章主要介紹了解決Spring boot 嵌入的tomcat不啟動(dòng)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-10-10
簡(jiǎn)單介紹一下什么是microservice微服務(wù)
這篇文章主要介紹了一下什么是microservice微服務(wù)微服務(wù)的定義,微服務(wù)到底是什么意思?什么樣的架構(gòu)可以叫做微服務(wù)?這篇文章可以給你答案2023-03-03
java.nio.file.WatchService?實(shí)時(shí)監(jiān)控文件變化的示例代碼
在?Java?語(yǔ)言中,從?JDK7?開始,新增了java.nio.file.WatchService類,用來(lái)實(shí)時(shí)監(jiān)控文件的變化,這篇文章主要介紹了java.nio.file.WatchService?實(shí)時(shí)監(jiān)控文件變化,需要的朋友可以參考下2022-05-05
java8 stream sort自定義復(fù)雜排序案例
這篇文章主要介紹了java8 stream sort自定義復(fù)雜排序案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-10-10
SpringBoot3 RestTemplate配置與使用詳解
本文詳細(xì)介紹了在 SpringBoot 3.x 中如何配置和使用 RestTemplate,包括基本配置、高級(jí)配置以及各種使用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧2024-12-12
微信公眾帳號(hào)開發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例
本篇文章主要介紹了微信公眾帳號(hào)開發(fā)-自定義菜單的創(chuàng)建及菜單事件響應(yīng)的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
SVN報(bào)錯(cuò):Error Updating changes:svn:E155037的解決方案
今天小編就為大家分享一篇關(guān)于SVN報(bào)錯(cuò):Error Updating changes:svn:E155037的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
Java super關(guān)鍵字調(diào)用父類過程解析
這篇文章主要介紹了Java super關(guān)鍵字調(diào)用父類過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

