获取并为Java数组赋值?

时间:2016-10-02 19:38:20

标签: java arrays fibonacci

我目前正在学习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;
      }

  }
}

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

Fibonacci number是前两个数字的总和:

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));
}

答案 1 :(得分:1)

您的代码中存在一些逻辑错误。

第一个循环: -

最初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。

对于Fibonacci序列,您需要添加前两个值,但您只考虑代码中的先前值。这是您的代码的更正版本: -

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个术语。

答案 2 :(得分:0)

你的问题是那个

A)所有数组值都初始化为0

B)在为其分配值之前,您正在访问“下一个”数组值!

将输出更改为:

<?php if($this->session->flashdata('error_msg1')) : ?>
<div class="alert alert-success">
    <span class="alert-rr">
        <i class="fa fa-check-circle" aria-hidden="true"></i>
    </span>
    <span class="alert-msg">
        <?php echo $this->session->flashdata('error_msg1'); ?>
    </span>
</div>
<?php endif; ?>

你会发现它打印出来:

  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]);

最后一行显示了正在发生的事情:在为其分配值之前,在索引3处获取值。因此,你的整个斐波纳契总和......并没有“开始”;因为你不断失去价值观。

换句话说:你必须确保你的计数器正常增加:

1 counter: 0/1
2 counter: 1/1
3 counter: 2/2
1 counter: 2/2
2 counter: 3/0

含义:对于每个计数器值,您需要一个完整循环。当你运行我的解决方案时,你会发现它运行良好(直到计数器命中44/45并且我们遇到int溢出;因为数字太大了)。

答案 3 :(得分:0)

在第一次迭代后,您将拥有以下值:

n1 = 1

n2 = 1

fibsum = 2

fib [2] = 2

从fib [3]到长度的所有其他值都未初始化。

所以在第二次迭代中:

n1 = 2 现在计数器值将增加1,这是counter = 3

n2 = fib [3]
//这个没有正确计算,因此问题。