首页 > 解决方案 > 减少到三元素数组后,斐波那契迭代错误中长度为 3 的索引 3 超出范围

问题描述

我有一个任务,我应该使用循环和数组创建斐波那契迭代。如何检查 fibonacciNumberInOrder 的负值?我的导师告诉我,我不需要在数组中分配 N 个元素。我可以将其减少为 3element 数组。我应该将这个数组指向最后三个斐波那契数。现在我收到一个错误:Index 3 out of bounds for length 3。我想这是因为我改变了这个:

long [] fibonacci = new long [fibonacciNumberInOrder];

至:

long [] fibonacci = new long [] {1,1,2};

我应该怎么做才能让它发挥作用并保持导师的要求?

    public class FibonacciIterative {

    public static void main(String[] args) {
        int fibonacciNumberInOrder = 5;
        fibonacci(fibonacciNumberInOrder);
    }

    public static long[] fibonacci(int fibonacciNumberInOrder) {
        long [] fibonacci = new long [] {1,1,2};
        for (int i = 2; i < fibonacciNumberInOrder; i++) {
            fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
            System.out.print(Arrays.toString(fibonacci) + ", ");
        }
        return fibonacci;
    }
}

标签: javaiterationfibonacci

解决方案


问题是您试图将所有元素存储在Array. 但是,由于您Array的大小只有 3,因此您很快就会尝试访问超出范围的索引。你的导师说得对,你只需要三个名额。一旦空间不足,您可以移动元素并覆盖以前的条目。(您只需要序列中的前两个数字,然后中的第三个位置Array将是前两个数字的总和)

所以它会像这样:

迭代:

  1. [1, 1, 2]

  2. [1, 2, 3]

  3. [2, 3, 5]

  4. [3, 5, 8]

等等。为此,您可以使用简单的 for 循环将每个元素左移一个:

public static long[] fibonacci(int fibonacciNumberInOrder) {
    long [] fibonacci = new long [] {1,1,2};
    for (int i = 0; i < fibonacciNumberInOrder; i++) {
        System.out.print(Arrays.toString(fibonacci) + ", ");
        for(int j = 1; j < 3; j++) {
            fibonacci[j-1] = fibonacci[j];
        }
        fibonacci[2] = fibonacci[1] + fibonacci[0];         
    }
    return fibonacci;
}

如果你试图打印Array方法返回的值,那么你需要打印方法的结果而不是忽略返回值,并且你需要去掉方法中的打印语句:

public static void main(String[] args) {
    int fibonacciNumberInOrder = 5;
    System.out.println(Arrays.toString(fibonacci(fibonacciNumberInOrder)));
}

推荐阅读