获取 Java 数组并为其赋值?
Getting and assigning values to Java arrays?
我目前正在学习 Java 我才刚刚开始,所以我对它的了解不是很好。
我编写的计算 Fibonacci sequence 的前 100 个值的程序有问题。关键是它只输出 2 而没有其他数字。
这是我的程序代码:
class MyClass1 {
public static void main(String[ ] args) {
int[] fib = new int[102];
fib[0] = 1;
fib[1] = 1;
int counter = 0;
int n1, n2, fibSum;
while(counter < (fib.length - 2)){
n1 = fib[counter];
System.out.println(fib[counter]);
counter++;
n2 = fib[counter];
System.out.println(n2);
counter++;
fibSum = n1 + n2;
System.out.println(fibSum);
fib[counter] = fibSum;
}
}
}
感谢您的帮助。
Fibonacci number是前面2个数的和:
fibonacci(n) = fibonacci(n - 1) + fibonacci(n - 2)
所以使用递归可以很好地评估它:
private static long fibonacci(int n) {
if (n <= 1) return n;
else return fibonacci(n - 1) + fibonacci(n - 2); }
public static void main(String[] args) {
int n = 102;
for (int i = 1; i <= n; i++)
System.out.println(i + ": " + fibonacci(i));
}
你的问题是
A) 所有数组值都初始化为0
B) 您正在访问 "the next" 数组值,然后再为其赋值!
当您将输出更改为:
System.out.println("1. counter: " + counter + "/" + fib[counter]);
counter++;
n2 = fib[counter];
System.out.println("2. counter: " + counter + "/" + fib[counter]);
counter++;
fibSum = n1 + n2;
fib[counter] = fibSum;
System.out.println("3. counter: " + counter + "/" + fib[counter]);
你会发现它打印出:
1 counter: 0/1
2 counter: 1/1
3 counter: 2/2
1 counter: 2/2
2 counter: 3/0
最后一行向您展示了正在发生的事情:您在索引 3 处获取值……然后再为其赋值。因此,您的整个斐波那契总和...没有 "start";因为你一直在失去价值。
换句话说:您必须确保您的计数器适当增加:
while(counter < (fib.length - 2)){
n1 = fib[counter];
System.out.println("1 counter: " + counter + "/" + fib[counter]);
n2 = fib[counter+1];
System.out.println("2 counter: " + counter + "/" + fib[counter+1]);
fibSum = n1 + n2;
fib[counter+2] = fibSum;
System.out.println("3 counter: " + counter + "/" + fib[counter+2]);
counter++;
}
意思:你需要一个个完整的循环来计算计数器的每个值。当您 运行 我的解决方案时,您会发现它运行良好(直到计数器达到 44/45 并且我们 运行 进入 int 溢出;因为数字变得太大)。
您的代码中存在一些逻辑错误。
第一个循环:-
最初 n1=fib[0]=1 和 n2=fib[1]=1 并且您打印两者。 fib[2] 是总和,所以它是 2。到目前为止一切顺利。
第二个循环:-
n1 = fib[2] = 2。n2 = fib[3] = 0,因此 fib[4] = 2。这就是问题发生的地方。因此,从第二个循环开始,您将始终在输出中看到 2 0 2。
对于斐波那契数列,您需要添加前两个值,但您在代码中只考虑前一个值。这是您的代码的更正版本:-
public static void main(String[ ] args) {
double[] fib = new double[100];
fib[0] = 1;
fib[1] = 1;
int counter = 2;
double n1, n2, fibSum;
System.out.println(fib[0]);
System.out.println(fib[1]);
while(counter < fib.length){
n1 = fib[counter-1];
n2 = fib[counter-2];
fibSum = n1 + n2;
System.out.println(fibSum);
fib[counter] = fibSum;
counter++;
}
}
请注意,我使用的是 double 类型,因为类型 int 甚至 long 都不足以达到此序列中的第 100 个项。
第一次迭代后,您将获得以下值:
n1 = 1
n2 = 1
斐波和=2
纤维[2] = 2
从 fib[3] 到 length 的所有其他值都未初始化。
所以在第二次迭代中:
n1 = 2
现在计数器值将增加 1,即 counter = 3
n2 = fib[3]
// 这个计算不正确,因此出现问题。
我目前正在学习 Java 我才刚刚开始,所以我对它的了解不是很好。 我编写的计算 Fibonacci sequence 的前 100 个值的程序有问题。关键是它只输出 2 而没有其他数字。
这是我的程序代码:
class MyClass1 {
public static void main(String[ ] args) {
int[] fib = new int[102];
fib[0] = 1;
fib[1] = 1;
int counter = 0;
int n1, n2, fibSum;
while(counter < (fib.length - 2)){
n1 = fib[counter];
System.out.println(fib[counter]);
counter++;
n2 = fib[counter];
System.out.println(n2);
counter++;
fibSum = n1 + n2;
System.out.println(fibSum);
fib[counter] = fibSum;
}
}
}
感谢您的帮助。
Fibonacci number是前面2个数的和:
fibonacci(n) = fibonacci(n - 1) + fibonacci(n - 2)
所以使用递归可以很好地评估它:
private static long fibonacci(int n) {
if (n <= 1) return n;
else return fibonacci(n - 1) + fibonacci(n - 2); }
public static void main(String[] args) {
int n = 102;
for (int i = 1; i <= n; i++)
System.out.println(i + ": " + fibonacci(i));
}
你的问题是
A) 所有数组值都初始化为0
B) 您正在访问 "the next" 数组值,然后再为其赋值!
当您将输出更改为:
System.out.println("1. counter: " + counter + "/" + fib[counter]);
counter++;
n2 = fib[counter];
System.out.println("2. counter: " + counter + "/" + fib[counter]);
counter++;
fibSum = n1 + n2;
fib[counter] = fibSum;
System.out.println("3. counter: " + counter + "/" + fib[counter]);
你会发现它打印出:
1 counter: 0/1
2 counter: 1/1
3 counter: 2/2
1 counter: 2/2
2 counter: 3/0
最后一行向您展示了正在发生的事情:您在索引 3 处获取值……然后再为其赋值。因此,您的整个斐波那契总和...没有 "start";因为你一直在失去价值。
换句话说:您必须确保您的计数器适当增加:
while(counter < (fib.length - 2)){
n1 = fib[counter];
System.out.println("1 counter: " + counter + "/" + fib[counter]);
n2 = fib[counter+1];
System.out.println("2 counter: " + counter + "/" + fib[counter+1]);
fibSum = n1 + n2;
fib[counter+2] = fibSum;
System.out.println("3 counter: " + counter + "/" + fib[counter+2]);
counter++;
}
意思:你需要一个个完整的循环来计算计数器的每个值。当您 运行 我的解决方案时,您会发现它运行良好(直到计数器达到 44/45 并且我们 运行 进入 int 溢出;因为数字变得太大)。
您的代码中存在一些逻辑错误。
第一个循环:-
最初 n1=fib[0]=1 和 n2=fib[1]=1 并且您打印两者。 fib[2] 是总和,所以它是 2。到目前为止一切顺利。
第二个循环:-
n1 = fib[2] = 2。n2 = fib[3] = 0,因此 fib[4] = 2。这就是问题发生的地方。因此,从第二个循环开始,您将始终在输出中看到 2 0 2。
对于斐波那契数列,您需要添加前两个值,但您在代码中只考虑前一个值。这是您的代码的更正版本:-
public static void main(String[ ] args) {
double[] fib = new double[100];
fib[0] = 1;
fib[1] = 1;
int counter = 2;
double n1, n2, fibSum;
System.out.println(fib[0]);
System.out.println(fib[1]);
while(counter < fib.length){
n1 = fib[counter-1];
n2 = fib[counter-2];
fibSum = n1 + n2;
System.out.println(fibSum);
fib[counter] = fibSum;
counter++;
}
}
请注意,我使用的是 double 类型,因为类型 int 甚至 long 都不足以达到此序列中的第 100 个项。
第一次迭代后,您将获得以下值:
n1 = 1
n2 = 1
斐波和=2
纤维[2] = 2
从 fib[3] 到 length 的所有其他值都未初始化。
所以在第二次迭代中:
n1 = 2 现在计数器值将增加 1,即 counter = 3
n2 = fib[3]
// 这个计算不正确,因此出现问题。