小編給大家分享一下java語言中如何解決求兔子問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1、思考
兔子問題,是費氏數(shù)列的形象化說法,它是由一位名為Fibonacci的數(shù)學家在它的著作中提出的一個問題。
2、描述
它體術(shù)的問題是:若有一只免子每個月生一只小免子,一個月后小免子也開始生產(chǎn)。起初只有一只免子,一個月后就有兩只免子,二個月后有三只免子,三個月后有五只免子(小免子投入生產(chǎn))......
我們使用數(shù)學的方式表達出來,便是下面的一組數(shù)列:
1、1、2、3、5、8、13、21、34、55、89......
注意:新生的小免子需一個月成長期才會投入生產(chǎn)!而且這些兔子是不死的哦?。?!
3、規(guī)律
當我們莫名其妙的接觸到這個問題的時候,很難找到其中的規(guī)律,但是依照數(shù)學中數(shù)列的規(guī)律去思考這個問題,等比?等差?還是其它什么?既然這是一個由數(shù)學家提出的問題,那么其中應(yīng)該有一定的數(shù)學規(guī)律吧?到底是什么規(guī)律呢,仔細分析上面的一組數(shù)列,相比你已經(jīng)有了答案了。沒錯,它用一句話來表述,從第三項開始,前面兩項的和等于第三項。
假設(shè)第n項的數(shù)值為fn,那么該數(shù)列的規(guī)律性使用數(shù)學公式表達如下:
4、偽代碼
所謂偽代碼,就是不是真的代碼,它并不能在機器上執(zhí)行,只是一段介于自然語言和編程語言之間的一種表達程序邏輯的有意義的符號。對于兔子問題的偽代碼,我們這里使用上述公式的遞歸方式,可以有以下的偽代碼:
Procedure FIB(N) [ IF (N < 0) PRINT ("輸入錯誤"); IF (N = 0 OR N = 1) RETURN (N); ELSE RETURN ( FIB(N-1) + FIB(N-2) ); ]
根據(jù)之前文章所描述的遞歸概念,詳細情況可以參考之前的《漢諾塔問題》,相比大家對遞歸已經(jīng)不會太陌生,那么根據(jù)上述我們得到的數(shù)學公式,推演出這樣的遞歸偽代碼,會非常簡潔明了。但是,額,可能大家猜到了,我要說但是。大家是否發(fā)現(xiàn)一個問題,當我們的n值過大的時候,程序會比較慢?
如果你發(fā)現(xiàn)了,說明你認真思考了這個問題,相比你也應(yīng)該解決了心中的疑惑。如果還有沒有解決疑惑的,就隨著我來解決大家的疑惑。為什么會比較慢呢?原因在于,當我們計算后面的第n項的時候,需要再次計算n-1和n-2項,而這兩項在之前都是已經(jīng)被計算過了的,我們再求后面的一個數(shù)的時候,還是要在計算一邊,無形之中,我們就多做了很多無用功。
那么,我們時候有好的方法去解決這個問題呢?答案是有的。根據(jù)上面的分析,當我們在求解第n項的時候,前面n-1和n-2項是已經(jīng)求解過的,那么,為什么我們不把它存起來呀????
哈哈,有沒有瞬間豁然開朗,對呀!我們這里是使用空間換時間,可以大大提高效率哦!這里我就不寫偽代碼了。
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(); } }
以上是“java語言中如何解決求兔子問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享文章:java語言中如何解決求兔子問題-創(chuàng)新互聯(lián)
當前鏈接:http://jinyejixie.com/article2/gpsoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、域名注冊、品牌網(wǎng)站制作、虛擬主機、網(wǎng)站維護、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容