Java 斐波那契數列


斐波那契數列指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……

在數學上,斐波那契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(≥ 3,∈ N*)

也就是第一項等於1,第二項等於1,第三項開始每一項都等於前兩項的和。第三項 = 第二項 + 第一項,也就是 1 + 1 = 2;第四項 = 第三項 + 第二項,2 + 1 = 3......以此類推。

我們先定義一個變量存儲F(n-1),F(n-2),然后每次累加的時候都改掉它們的值。累計次數達到后,把F(n-1)跟F(n-2)相加起來就得到了F(n)。

        int num = 7;
            
        int a = 1;// F1 F(n-2)
        int b = 1;// F2 F(n-1)
        int c = 2;// F3 F(n)
        
        for(int i = 3;i < num;i ++) {
            
            a = b;
            b = c;

            c = a + b;
            
            System.out.println("第"+(i - 2)+"次循環:(F("+ (i-1) +")="+a+") + (F("+ (i) +")="+b+") = (F("+ (i + 1) +")="+c+")");
            
        }
        
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        
//      第1次循環:(F(2)=1) + (F(3)=2) = (F(4)=3)
//        第2次循環:(F(3)=2) + (F(4)=3) = (F(5)=5)
//        第3次循環:(F(4)=3) + (F(5)=5) = (F(6)=8)
//        第4次循環:(F(5)=5) + (F(6)=8) = (F(7)=13)
//        5
//        8
//        13

這樣我們就可以算出了第7項的斐波那契數是13。

這樣子就算是完成的實現。但是還有問題,比如如果我們要求第200項的話,返回結果就成了這個樣子。

......
第195次循環:(F(196)=-2021822589) + (F(197)=1163854213) = (F(198)=-857968376) 第196次循環:(F(197)=1163854213) + (F(198)=-857968376) = (F(199)=305885837) 第197次循環:(F(198)=-857968376) + (F(199)=305885837) = (F(200)=-552082539) -857968376 305885837 -552082539

數值是不對的,因為數值太大,超出了int的最大值,數據溢出了。

int的取值范圍為(-2147483648~2147483647)

我們這里使用BigInteger進行計算,在 Java中 用來做大數操作的一個類 —— BigInteger類。關於 BigInteger類可以看看https://blog.csdn.net/qq_40893056/article/details/82686266

        int num = 200;
        
        BigInteger a = new BigInteger(String.valueOf(1));// F1 F(n-2)
        BigInteger b = new BigInteger(String.valueOf(1));// F2 F(n-1)
        BigInteger c = new BigInteger(String.valueOf(2));// F3 F(n)
        
        for(int i = 3;i < num;i ++) {
            
            a = b;
            b = c;

            c = a.add(b);
            
            System.out.println("第"+(i - 2)+"次循環:(F("+ (i-1) +")="+a.toString()+") + (F("+ (i) +")="+b.toString()+") = (F("+ (i+1) +")="+c.toString()+")");
            
        }
        
        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString());
        
//        第195次循環:(F(196)=40934782466626840596168752972961528246147) + (F(197)=66233869353085486281758142155705206899077) = (F(198)=107168651819712326877926895128666735145224)
//        第196次循環:(F(197)=66233869353085486281758142155705206899077) + (F(198)=107168651819712326877926895128666735145224) = (F(199)=173402521172797813159685037284371942044301)
//        第197次循環:(F(198)=107168651819712326877926895128666735145224) + (F(199)=173402521172797813159685037284371942044301) = (F(200)=280571172992510140037611932413038677189525)
//        107168651819712326877926895128666735145224
//        173402521172797813159685037284371942044301
//        280571172992510140037611932413038677189525

現在數值能夠正確的顯示出來了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM