Индекс 3 за пределами длины 3 в итерационной ошибке Фибоначчи после сокращения до трехэлементного массива - PullRequest
0 голосов
/ 28 мая 2019

У меня есть задача, где я должен создать итерацию Фибоначчи, используя цикл и массив.Как я могу проверить отрицательные значения для fibonacciNumberInOrder?Мой преподаватель сказал мне, что мне не нужно выделять N элементов в массиве.Я могу уменьшить его до 3-элементного массива.И я должен указать этот массив на последние три числа Фибоначчи.Теперь я получаю сообщение об ошибке: Индекс 3 выходит за пределы длины 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;
    }
}

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Проблема в том, что вы пытаетесь сохранить все элементы в Array.Однако, поскольку ваш Array имеет размер только три, вы очень быстро пытаетесь получить доступ к индексу, который находится за пределами.Ваш репетитор прав, что вам нужно только три места.Вы можете сдвинуть элементы, когда у вас закончится свободное место, и перезаписать предыдущие записи.(Вам нужны только два предыдущих числа в последовательности, и затем третье место в 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, возвращенный методом, то вам необходимо распечатать результатыметод вместо игнорирования возвращаемого значения, и вам необходимо удалить оператор print в методе:

public static void main(String[] args) {
    int fibonacciNumberInOrder = 5;
    System.out.println(Arrays.toString(fibonacci(fibonacciNumberInOrder)));
}
0 голосов
/ 28 мая 2019

Исключение произошло, потому что вы пытаетесь получить доступ к элементу с индексом, выходящим за пределы. В вашем сценарии вы пытаетесь получить доступ к третьему элементу массива, используя индексное значение 3, когда оно должно быть значением 2. Вот краткий отрывок из документации Java о массивах:

Каждый элемент в массиве называется элементом, и каждый элемент доступен по его числовому индексу. Как показано на предыдущем рисунке, нумерация начинается с 0. Например, 9-й элемент будет доступен по индексу 8.

...