斐波那契数列计算公式为:
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最大值造成了异常