1
votes

Déplacement itératif de Fibonacci dans le tableau []

Mon but est d'écrire une méthode montrant comment la séquence fibonacci se déplace. Je dois utiliser un tableau et une équation pour montrer comment les nombres se déplacent sur le tableau (itérant ainsi la valeur en utilisant la méthode fibonacci: numéro précédent + numéro actuel = numéro suivant).

C'est la logique que je veux utiliser avec le tableau [] comme représentation:

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

Je suis allé jusque-là et je suis bloqué:

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

return nextNumber;

La valeur renvoyée semble correcte. Dans le test fibonacci, fib de 5 est 5 et 4 est 3. Ce qui m'inquiète, c'est à quoi ressemble cette chaîne sur le débogueur. La façon dont je les déplace les fait ressembler à ceci: {3,5,2,3,5} et cela devrait être {1,1,2,3,5}.


1 commentaires

Jakub Szarubka - Si l'une des réponses a résolu votre problème, vous pouvez aider la communauté en la marquant comme acceptée. Une réponse acceptée aide les futurs visiteurs à utiliser la solution en toute confiance. Vérifiez meta.stackexchange.com/questions / 5234 /… pour savoir comment procéder.


4 Réponses :


0
votes

Votre boucle est fausse. Ce devrait être:

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

Vous ne devriez jamais changer fib [0] et fib [1] , et fib [i ] devrait être la somme des deux éléments précédents.

Si le but était de calculer fib (i) sans tableau, vous auriez besoin de deux variables à conserver suivi des deux dernières valeurs:

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


0 commentaires

0
votes

Vous n'avez pas besoin d'un tableau.

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

Cette implémentation est plus simple et plus lisible.


0 commentaires

0
votes

Qu'est-ce qui vous empêche d'utiliser l'algorithme que vous avez publié? Vous trouverez ci-dessous le code basé sur l'algorithme que vous avez publié:

1 1 2 3 5 8 13 

Sortie:

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

[Update] publiant la mise à jour suivante en fonction de votre commentaire:

1 1 2 3 5 8 13 

Sortie:

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


2 commentaires

Besoin d'utiliser un tableau comme représentation.


@JakubSzarubka - Je viens de publier une mise à jour et j'espère qu'elle devrait répondre à vos besoins. N'hésitez pas à commenter en cas de doute supplémentaire.



0
votes

Voici à quoi devrait ressembler votre méthode:

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
    }


2 commentaires

Salut Piotr, j'ai oublié de mentionner mais je ne peux pas utiliser la récursivité pour celui-ci.


Salut Jakub, ce n'est pas une récurrence - il ne fait que renvoyer le dernier élément calculé d'un tableau - exactement comme vous l'avez fait :)