斐波那契数列指的是这样一个数列: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
现在数值能够正确的显示出来了。