斐波那契数列计算公式为:
f(n) = f(n-1)+ f(n-2)
基于此写了一个方法,用于输出一个长度为指定的斐波那契数列(从正数1开始, 即1,1 ,2 ,3 ,5 ....):
static void fn(int t){
List<Integer> al = new ArrayList<Integer>();
for (int a = al.size(); a < t;a++){
if (al.size() == 0) {
al.add(1);
}
else if (al.size() == 1) {
al.add(1);
}
else if (al.size() == 2){
al.add(2);
}
else{
int sum = al.get(a-1)+al.get(a-2);
System.out.println("上一个数的值为: "+al.get(a-1) + " 倒数第二个数的值为: " + al.get(a-2)+ " 他们的和为: "+ sum);
al.add(al.get(a-1)+al.get(a-2));
}
}
System.out.println(al);
}
当调用fn(10)时程序执行正常,输出结果为:
上一个数的值为: 2 倒数第二个数的值为: 1 他们的和为: 3
上一个数的值为: 3 倒数第二个数的值为: 2 他们的和为: 5
上一个数的值为: 5 倒数第二个数的值为: 3 他们的和为: 8
上一个数的值为: 8 倒数第二个数的值为: 5 他们的和为: 13
上一个数的值为: 13 倒数第二个数的值为: 8 他们的和为: 21
上一个数的值为: 21 倒数第二个数的值为: 13 他们的和为: 34
上一个数的值为: 34 倒数第二个数的值为: 21 他们的和为: 55
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
当调用fn(100)时程序执行异常,结果为:
上一个数的值为: 2 倒数第二个数的值为: 1 他们的和为: 3
上一个数的值为: 3 倒数第二个数的值为: 2 他们的和为: 5
上一个数的值为: 5 倒数第二个数的值为: 3 他们的和为: 8
上一个数的值为: 8 倒数第二个数的值为: 5 他们的和为: 13
上一个数的值为: 13 倒数第二个数的值为: 8 他们的和为: 21
上一个数的值为: 21 倒数第二个数的值为: 13 他们的和为: 34
上一个数的值为: 34 倒数第二个数的值为: 21 他们的和为: 55
上一个数的值为: 55 倒数第二个数的值为: 34 他们的和为: 89
上一个数的值为: 89 倒数第二个数的值为: 55 他们的和为: 144
上一个数的值为: 144 倒数第二个数的值为: 89 他们的和为: 233
上一个数的值为: 233 倒数第二个数的值为: 144 他们的和为: 377
上一个数的值为: 377 倒数第二个数的值为: 233 他们的和为: 610
上一个数的值为: 610 倒数第二个数的值为: 377 他们的和为: 987
上一个数的值为: 987 倒数第二个数的值为: 610 他们的和为: 1597
上一个数的值为: 1597 倒数第二个数的值为: 987 他们的和为: 2584
上一个数的值为: 2584 倒数第二个数的值为: 1597 他们的和为: 4181
上一个数的值为: 4181 倒数第二个数的值为: 2584 他们的和为: 6765
上一个数的值为: 6765 倒数第二个数的值为: 4181 他们的和为: 10946
上一个数的值为: 10946 倒数第二个数的值为: 6765 他们的和为: 17711
上一个数的值为: 17711 倒数第二个数的值为: 10946 他们的和为: 28657
上一个数的值为: 28657 倒数第二个数的值为: 17711 他们的和为: 46368
上一个数的值为: 46368 倒数第二个数的值为: 28657 他们的和为: 75025
上一个数的值为: 75025 倒数第二个数的值为: 46368 他们的和为: 121393
上一个数的值为: 121393 倒数第二个数的值为: 75025 他们的和为: 196418
上一个数的值为: 196418 倒数第二个数的值为: 121393 他们的和为: 317811
上一个数的值为: 317811 倒数第二个数的值为: 196418 他们的和为: 514229
上一个数的值为: 514229 倒数第二个数的值为: 317811 他们的和为: 832040
上一个数的值为: 832040 倒数第二个数的值为: 514229 他们的和为: 1346269
上一个数的值为: 1346269 倒数第二个数的值为: 832040 他们的和为: 2178309
上一个数的值为: 2178309 倒数第二个数的值为: 1346269 他们的和为: 3524578
上一个数的值为: 3524578 倒数第二个数的值为: 2178309 他们的和为: 5702887
上一个数的值为: 5702887 倒数第二个数的值为: 3524578 他们的和为: 9227465
上一个数的值为: 9227465 倒数第二个数的值为: 5702887 他们的和为: 14930352
上一个数的值为: 14930352 倒数第二个数的值为: 9227465 他们的和为: 24157817
上一个数的值为: 24157817 倒数第二个数的值为: 14930352 他们的和为: 39088169
上一个数的值为: 39088169 倒数第二个数的值为: 24157817 他们的和为: 63245986
上一个数的值为: 63245986 倒数第二个数的值为: 39088169 他们的和为: 102334155
上一个数的值为: 102334155 倒数第二个数的值为: 63245986 他们的和为: 165580141
上一个数的值为: 165580141 倒数第二个数的值为: 102334155 他们的和为: 267914296
上一个数的值为: 267914296 倒数第二个数的值为: 165580141 他们的和为: 433494437
上一个数的值为: 433494437 倒数第二个数的值为: 267914296 他们的和为: 701408733
上一个数的值为: 701408733 倒数第二个数的值为: 433494437 他们的和为: 1134903170
上一个数的值为: 1134903170 倒数第二个数的值为: 701408733 他们的和为: 1836311903
上一个数的值为: 1836311903 倒数第二个数的值为: 1134903170 他们的和为: -1323752223
上一个数的值为: -1323752223 倒数第二个数的值为: 1836311903 他们的和为: 512559680
上一个数的值为: 512559680 倒数第二个数的值为: -1323752223 他们的和为: -811192543
上一个数的值为: -811192543 倒数第二个数的值为: 512559680 他们的和为: -298632863
上一个数的值为: -298632863 倒数第二个数的值为: -811192543 他们的和为: -1109825406
上一个数的值为: -1109825406 倒数第二个数的值为: -298632863 他们的和为: -1408458269
上一个数的值为: -1408458269 倒数第二个数的值为: -1109825406 他们的和为: 1776683621
上一个数的值为: 1776683621 倒数第二个数的值为: -1408458269 他们的和为: 368225352
上一个数的值为: 368225352 倒数第二个数的值为: 1776683621 他们的和为: 2144908973
上一个数的值为: 2144908973 倒数第二个数的值为: 368225352 他们的和为: -1781832971
上一个数的值为: -1781832971 倒数第二个数的值为: 2144908973 他们的和为: 363076002
上一个数的值为: 363076002 倒数第二个数的值为: -1781832971 他们的和为: -1418756969
上一个数的值为: -1418756969 倒数第二个数的值为: 363076002 他们的和为: -1055680967
上一个数的值为: -1055680967 倒数第二个数的值为: -1418756969 他们的和为: 1820529360
上一个数的值为: 1820529360 倒数第二个数的值为: -1055680967 他们的和为: 764848393
上一个数的值为: 764848393 倒数第二个数的值为: 1820529360 他们的和为: -1709589543
上一个数的值为: -1709589543 倒数第二个数的值为: 764848393 他们的和为: -944741150
上一个数的值为: -944741150 倒数第二个数的值为: -1709589543 他们的和为: 1640636603
上一个数的值为: 1640636603 倒数第二个数的值为: -944741150 他们的和为: 695895453
上一个数的值为: 695895453 倒数第二个数的值为: 1640636603 他们的和为: -1958435240
上一个数的值为: -1958435240 倒数第二个数的值为: 695895453 他们的和为: -1262539787
上一个数的值为: -1262539787 倒数第二个数的值为: -1958435240 他们的和为: 1073992269
上一个数的值为: 1073992269 倒数第二个数的值为: -1262539787 他们的和为: -188547518
上一个数的值为: -188547518 倒数第二个数的值为: 1073992269 他们的和为: 885444751
上一个数的值为: 885444751 倒数第二个数的值为: -188547518 他们的和为: 696897233
上一个数的值为: 696897233 倒数第二个数的值为: 885444751 他们的和为: 1582341984
上一个数的值为: 1582341984 倒数第二个数的值为: 696897233 他们的和为: -2015728079
上一个数的值为: -2015728079 倒数第二个数的值为: 1582341984 他们的和为: -433386095
上一个数的值为: -433386095 倒数第二个数的值为: -2015728079 他们的和为: 1845853122
上一个数的值为: 1845853122 倒数第二个数的值为: -433386095 他们的和为: 1412467027
上一个数的值为: 1412467027 倒数第二个数的值为: 1845853122 他们的和为: -1036647147
上一个数的值为: -1036647147 倒数第二个数的值为: 1412467027 他们的和为: 375819880
上一个数的值为: 375819880 倒数第二个数的值为: -1036647147 他们的和为: -660827267
上一个数的值为: -660827267 倒数第二个数的值为: 375819880 他们的和为: -285007387
上一个数的值为: -285007387 倒数第二个数的值为: -660827267 他们的和为: -945834654
上一个数的值为: -945834654 倒数第二个数的值为: -285007387 他们的和为: -1230842041
上一个数的值为: -1230842041 倒数第二个数的值为: -945834654 他们的和为: 2118290601
上一个数的值为: 2118290601 倒数第二个数的值为: -1230842041 他们的和为: 887448560
上一个数的值为: 887448560 倒数第二个数的值为: 2118290601 他们的和为: -1289228135
上一个数的值为: -1289228135 倒数第二个数的值为: 887448560 他们的和为: -401779575
上一个数的值为: -401779575 倒数第二个数的值为: -1289228135 他们的和为: -1691007710
上一个数的值为: -1691007710 倒数第二个数的值为: -401779575 他们的和为: -2092787285
上一个数的值为: -2092787285 倒数第二个数的值为: -1691007710 他们的和为: 511172301
上一个数的值为: 511172301 倒数第二个数的值为: -2092787285 他们的和为: -1581614984
上一个数的值为: -1581614984 倒数第二个数的值为: 511172301 他们的和为: -1070442683
上一个数的值为: -1070442683 倒数第二个数的值为: -1581614984 他们的和为: 1642909629
上一个数的值为: 1642909629 倒数第二个数的值为: -1070442683 他们的和为: 572466946
上一个数的值为: 572466946 倒数第二个数的值为: 1642909629 他们的和为: -2079590721
上一个数的值为: -2079590721 倒数第二个数的值为: 572466946 他们的和为: -1507123775
上一个数的值为: -1507123775 倒数第二个数的值为: -2079590721 他们的和为: 708252800
上一个数的值为: 708252800 倒数第二个数的值为: -1507123775 他们的和为: -798870975
上一个数的值为: -798870975 倒数第二个数的值为: 708252800 他们的和为: -90618175
上一个数的值为: -90618175 倒数第二个数的值为: -798870975 他们的和为: -889489150
上一个数的值为: -889489150 倒数第二个数的值为: -90618175 他们的和为: -980107325
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, -1323752223, 512559680, -811192543, -298632863, -1109825406, -1408458269, 1776683621, 368225352, 2144908973, -1781832971, 363076002, -1418756969, -1055680967, 1820529360, 764848393, -1709589543, -944741150, 1640636603, 695895453, -1958435240, -1262539787, 1073992269, -188547518, 885444751, 696897233, 1582341984, -2015728079, -433386095, 1845853122, 1412467027, -1036647147, 375819880, -660827267, -285007387, -945834654, -1230842041, 2118290601, 887448560, -1289228135, -401779575, -1691007710, -2092787285, 511172301, -1581614984, -1070442683, 1642909629, 572466946, -2079590721, -1507123775, 708252800, -798870975, -90618175, -889489150, -980107325]
可以看到结果中正数相加计算出了负数,导致了计算的结果有异常,造成这个结果的原因为:
java中int的定义:
public static final int MAX_VALUE
最大值定义为: 2的32次方减一 即2147483647
以上答案变为负数时的和为: 1836311903 + 1134903170 = 2971215073
2971215073 已经大于 2147483647 超过了int最大值造成了异常
转载于:https://blog.51cto.com/warcraft3/1887185