Итеративное движение Фибоначчи в массиве [] - PullRequest
1 голос
/ 02 февраля 2020

Моя цель - написать метод, показывающий, как движется последовательность Фибоначчи. Я должен использовать массив и уравнение, чтобы показать, как числа перемещаются в массиве (таким образом, повторяя значение, используя метод Фибоначчи: предыдущее число + текущее число = следующее число).

Это логика c, которая Я хочу использовать массив [] в качестве представления:

    n = fibonacci number
    i = 1;
    previousNumber = 0 
    nextNumber = 1 
    sum = previousNumber + nextNumber;
    while (i <= n) {
    sum = previousNumber + nextNumber;
    previousNumber = nextNumber;
    nextNumber = sum;

return nextNumber;

Я зашел так далеко, что застрял:

long fibonacci(int fibonacci) {
    int[] fib = new int[20];
    if (fibonacci < 0) {
        throw new IllegalArgumentException("n value cannot be negative number");
    }
    if (fibonacci == 0 || fibonacci == 1) {
        return 1;
    }
    fib[0] = 1;
    fib[1] = 1;
    int i ;
    for (i = 2; i < fibonacci; i++) {
        fib[i] = fib[0] + fib[1];
        fib[0] = fib[1];
        fib[1] = fib[i]; 
    }
    return fib[i];
}

Возвращенное значение выглядит нормально. В тесте Фибоначчи fib из 5 - это 5, а 4 - 3. Меня беспокоит то, как эта строка выглядит в отладчике. То, как я их перемещаю, заставляет их выглядеть так: {3,5,2,3,5} и должно быть {1,1,2,3,5}.

Ответы [ 4 ]

0 голосов
/ 02 февраля 2020

Вот как должен выглядеть ваш метод:

static long fibonacci(int fibonacci) {
        int[] fib = new int[20];
        if (fibonacci < 0) {
            throw new IllegalArgumentException("n value cannot be negative number");
        }
        if (fibonacci == 0 || fibonacci == 1) {
            return 1;
        }
        fib[0] = 1;
        fib[1] = 1;
        int i;
        for (i = 2; i < fibonacci; i++) {
            fib[i] = fib[i - 1] + fib[i - 2]; // change here
        }
        return fib[i-1]; // change here
    }
0 голосов
/ 02 февраля 2020

Вам не нужен массив.

long fibonacci(int fibonacci) {
    if (fibonacci < 0) {
        throw new IllegalArgumentException("n value cannot be negative number");
    }
    if (fibonacci == 0 || fibonacci == 1) {
        return 1;
    }
    first = 1;
    second = 1;
    sum i;
    for (i = 2; i <= fibonacci; i++) {
        sum = first + second;
        first  = second;
        second = sum; 
    }
   return sum;
}

Эта реализация проще и удобочитаемее.

0 голосов
/ 02 февраля 2020

Что мешает вам использовать алгоритм, который вы опубликовали? Ниже приведен код, основанный на опубликованном вами алгоритме:

public class Main {
    public static void main(String[] args) {
        // Test
        for (int i = 0; i < 7; i++) {
            System.out.print(fibonacci(i) + " ");
        }
    }

    static long fibonacci(int n) {
        if (n < 0) {
            throw new IllegalArgumentException("n value cannot be negative number");
        }
        int i = 1;
        int previousNumber = 0;
        int nextNumber = 1;
        int sum = previousNumber + nextNumber;
        while (i <= n) {
            sum = previousNumber + nextNumber;
            previousNumber = nextNumber;
            nextNumber = sum;
            i++;
        }
        return nextNumber;
    }
}

Вывод:

1 1 2 3 5 8 13 

[Обновление] отправка следующее обновление на основе вашего комментария:

public class Main {
    public static void main(String[] args) {
        // Test
        for (int i = 0; i < 7; i++) {
            System.out.print(fibonacci(i) + " ");
        }
    }

    static long fibonacci(int fibonacci) {
        int[] fib = new int[20];
        if (fibonacci < 0 || fibonacci > 19) {
            throw new IllegalArgumentException("The term number should be between 0 and 20 (exclusinve)");
        }
        if (fibonacci == 0 || fibonacci == 1) {
            return 1;
        }
        fib[0] = 1;
        fib[1] = 1;
        int i;
        for (i = 2; i <= fibonacci; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        return fib[i - 1];// After the loop has finished, i > fibonacci. Therefore, decrease i by 1
    }
}

Вывод:

1 1 2 3 5 8 13 
0 голосов
/ 02 февраля 2020

Ваш l oop не прав. Это должно быть:

for (i = 2; i <= fibonacci; i++) {
    fib[i] = fib[i-1] + fib[i-2];
}
return fib[i-1];

Вы никогда не должны менять fib[0] и fib[1], а fib[i] должно быть суммой двух предыдущих элементов.

Если целью было Для вычисления fib(i) без массива вам понадобятся две переменные, чтобы отслеживать последние два значения:

long fibonacci(int fibonacci) {
    if (fibonacci < 0) {
        throw new IllegalArgumentException("n value cannot be negative number");
    }
    if (fibonacci == 0 || fibonacci == 1) {
        return 1;
    }
    int beforeLast = 1;
    int last = 1;
    int i;
    int fib = 1;
    for (i = 2; i <= fibonacci; i++) {
        fib = last + beforeLast;
        beforeLast = last;
        last = fib;
    }
    return fib;
}
...