斐波那契數列指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……
在數學上,斐波那契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ 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
現在數值能夠正確的顯示出來了。