获取 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]
// 这个计算不正确,因此出现问题。