使用 for 循环的斐波那契数列
Fibonacci's Sequence using forloop
我正在尝试创建一个长度为 n
(用户输入)的数组,并且我认为我可以使用数组中关联的 i
值来计算我的斐波那契和。
这是我目前所知道的,我不知道应该如何提取 i
值作为 int 来计算总和。
public class Fibonacci {
public static void main(String[] args){
System.out.println("Please enter a value for n: ");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] newArray = new int[n];
int f1 = newArray[0];
int f2 = newArray[1];
int i;
for(i = 1; i <= n; ++i) {
System.out.print(f1 + " ");
int sum = f1 + f2;
f1 = f2;
f2 = sum;
}
}
}
如果有人对如何解决这个问题有任何建议并且可以解释一些理论,我们将不胜感激。
如果您使用数组存储斐波那契数列,您应该使用该数组中的索引访问斐波那契数列,无需使用中间变量f1, f2, sum
。
int[] fiboNums = new int[n]; // assuming n >= 2
fiboNums[0] = 1;
fiboNums[1] = 1;
System.out.printf("f(%2d)=%,13d ", i, fiboNums[i]);
for (int i = 2; i < n; i++) {
fiboNums[i] = fiboNums[i - 1] + fiboNums[i - 2];
System.out.printf("f(%2d)=%,13d ", i, fiboNums[i]);
if (i % 5 == 0) {
System.out.println();
}
}
然而,使用int
来表示斐波那契数列可能不是一个好主意,因为这个序列呈指数增长,当i == 46
时会发生整数溢出。
f( 1)= 1 f( 2)= 2 f( 3)= 3 f( 4)= 5 f( 5)= 8
f( 6)= 13 f( 7)= 21 f( 8)= 34 f( 9)= 55 f(10)= 89
f(11)= 144 f(12)= 233 f(13)= 377 f(14)= 610 f(15)= 987
f(16)= 1,597 f(17)= 2,584 f(18)= 4,181 f(19)= 6,765 f(20)= 10,946
f(21)= 17,711 f(22)= 28,657 f(23)= 46,368 f(24)= 75,025 f(25)= 121,393
f(26)= 196,418 f(27)= 317,811 f(28)= 514,229 f(29)= 832,040 f(30)= 1,346,269
f(31)= 2,178,309 f(32)= 3,524,578 f(33)= 5,702,887 f(34)= 9,227,465 f(35)= 14,930,352
f(36)= 24,157,817 f(37)= 39,088,169 f(38)= 63,245,986 f(39)= 102,334,155 f(40)= 165,580,141
f(41)= 267,914,296 f(42)= 433,494,437 f(43)= 701,408,733 f(44)=1,134,903,170 f(45)=1,836,311,903
同样,使用 long
将只能拟合 91 个斐波那契数。
我正在尝试创建一个长度为 n
(用户输入)的数组,并且我认为我可以使用数组中关联的 i
值来计算我的斐波那契和。
这是我目前所知道的,我不知道应该如何提取 i
值作为 int 来计算总和。
public class Fibonacci {
public static void main(String[] args){
System.out.println("Please enter a value for n: ");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] newArray = new int[n];
int f1 = newArray[0];
int f2 = newArray[1];
int i;
for(i = 1; i <= n; ++i) {
System.out.print(f1 + " ");
int sum = f1 + f2;
f1 = f2;
f2 = sum;
}
}
}
如果有人对如何解决这个问题有任何建议并且可以解释一些理论,我们将不胜感激。
如果您使用数组存储斐波那契数列,您应该使用该数组中的索引访问斐波那契数列,无需使用中间变量f1, f2, sum
。
int[] fiboNums = new int[n]; // assuming n >= 2
fiboNums[0] = 1;
fiboNums[1] = 1;
System.out.printf("f(%2d)=%,13d ", i, fiboNums[i]);
for (int i = 2; i < n; i++) {
fiboNums[i] = fiboNums[i - 1] + fiboNums[i - 2];
System.out.printf("f(%2d)=%,13d ", i, fiboNums[i]);
if (i % 5 == 0) {
System.out.println();
}
}
然而,使用int
来表示斐波那契数列可能不是一个好主意,因为这个序列呈指数增长,当i == 46
时会发生整数溢出。
f( 1)= 1 f( 2)= 2 f( 3)= 3 f( 4)= 5 f( 5)= 8
f( 6)= 13 f( 7)= 21 f( 8)= 34 f( 9)= 55 f(10)= 89
f(11)= 144 f(12)= 233 f(13)= 377 f(14)= 610 f(15)= 987
f(16)= 1,597 f(17)= 2,584 f(18)= 4,181 f(19)= 6,765 f(20)= 10,946
f(21)= 17,711 f(22)= 28,657 f(23)= 46,368 f(24)= 75,025 f(25)= 121,393
f(26)= 196,418 f(27)= 317,811 f(28)= 514,229 f(29)= 832,040 f(30)= 1,346,269
f(31)= 2,178,309 f(32)= 3,524,578 f(33)= 5,702,887 f(34)= 9,227,465 f(35)= 14,930,352
f(36)= 24,157,817 f(37)= 39,088,169 f(38)= 63,245,986 f(39)= 102,334,155 f(40)= 165,580,141
f(41)= 267,914,296 f(42)= 433,494,437 f(43)= 701,408,733 f(44)=1,134,903,170 f(45)=1,836,311,903
同样,使用 long
将只能拟合 91 个斐波那契数。