Série de Fibonacci dans Java Utilisation de la récursivité et des boucles

⚡ Résumé intelligent

Série de Fibonacci dans Java Ce programme génère une séquence où chaque terme est égal à la somme des deux termes précédents. Cet article présente les boucles for, while, la saisie utilisateur, la récursivité et les programmes mémorisés. tracelle évalue la récursivité et compare la complexité temporelle de chaque approche.

  • ➕ Règle fondamentale : Chaque terme est la somme des deux termes précédents, et la séquence commence par 0 et 1.
  • (I.e. Modèle itératif : Deux variables stockent les valeurs précédentes et suivantes, et une somme temporaire les décale vers l'avant à chaque itération.
  • ???? Modèle récursif : La méthode s'appelle elle-même deux fois par terme, avec 0, 1 et 2 comme cas de base.
  • ️ Écart de complexité : Les boucles s'exécutent en temps O(n) tandis que la récursion naïve s'exécute en O(2ⁿ), ce qui devient inutilisable au-delà d'environ 40 termes.
  • 🧠 Correction de la mémorisation : La mise en cache des termes calculés dans un tableau restaure le temps linéaire tandis que la conservationping la structure récursive.
  • ⚠️ Limite de dépassement : Le 47e terme dépasse la plage des entiers (int), donc un entier long ou BigInteger est nécessaire pour les séquences plus longues.
  • ️ Entrée utilisateur : La classe Scanner lit le nombre souhaité lors de l'exécution sans modifier aucune logique de génération.

Série de Fibonacci dans Java

Qu'est-ce que la série de Fibonacci Java?

A Série Fibonacci in Java La suite de Fibonacci est une série de nombres où chaque nombre est la somme des deux précédents. Les deux premiers nombres de la suite de Fibonacci sont 0 et 1. Les nombres de Fibonacci sont largement utilisés dans l'étude du temps d'exécution de l'algorithme qui détermine le plus grand commun diviseur de deux entiers.

The Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, ...

Exprimée sous forme de formule, la règle est F(n) = F(n-1) + F(n-2), avec F(0) = 0 et F(1) = 1. Le tableau ci-dessous montre comment les huit premiers termes sont produits.

Position (n) Calcul Valeur
0 Cas de base 0
1 Cas de base 1
2 0 + 1 1
3 1 + 1 2
4 1 + 2 3
5 2 + 3 5
6 3 + 5 8
7 5 + 8 13

Programme de la série Fibonacci dans Java en utilisant la boucle For

La version itérative ne conserve que deux valeurs en mémoire à un instant donné, ce qui explique son exécution en temps linéaire et en espace constant.

//Using  For Loop
public class FibonacciExample {
	public static void main(String[] args)
	{
		// Set it to the number of elements you want in the Fibonacci Series
		 int maxNumber = 10;
		 int previousNumber = 0;
		 int nextNumber = 1;
	        System.out.print("Fibonacci Series of "+maxNumber+" numbers:");
	        for (int i = 1; i <= maxNumber; ++i)
	        {
	            System.out.print(previousNumber+" ");
	            /* On each iteration, we are assigning second number
	             * to the first number and assigning the sum of last two
	             * numbers to the second number
	             */


	            int sum = previousNumber + nextNumber;
	            previousNumber = nextNumber;
	            nextNumber = sum;
	        }
	}
}

Sortie :

Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34

Logique du programme :

  • previousNumber est initialisé à 0 et nextNumber est initialisé à 1.
  • La boucle for de Fibonacci itère sur maxNumber:
    • Afficher le numéro précédent.
    • Calculez la somme de previousNumber et nextNumber.
    • Mettez à jour les nouvelles valeurs de previousNumber et nextNumber.

Programme de la série Fibonacci dans Java en utilisant la boucle While

Vous pouvez également générer un Java Suite de Fibonacci utilisant une while boucle dans JavaLes calculs arithmétiques sont identiques, seule la syntaxe de la boucle change.

//Using  While Loop
public class FibonacciWhileExample {
	public static void main(String[] args)
	{
		 int maxNumber = 10, previousNumber = 0, nextNumber = 1;
	        System.out.print("Fibonacci Series of "+maxNumber+" numbers:");

	        int i=1;
	        while(i <= maxNumber)
	        {
	            System.out.print(previousNumber+" ");
	            int sum = previousNumber + nextNumber;
	            previousNumber = nextNumber;
	            nextNumber = sum;
	            i++;
	        }

	}

}

Sortie :

Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34

La seule différence dans la logique du programme réside dans l'utilisation d'une boucle while pour afficher les nombres de Fibonacci. Le compteur doit être déclaré avant la boucle et incrémenté à l'intérieur de celle-ci, sinon la boucle ne se termine jamais.

Série de Fibonacci basée sur la saisie de l'utilisateur

Le codage en dur du nombre de termes est pratique pour une démonstration, mais dans les exercices réels, la valeur est généralement lue au clavier. La classe Scanner gère cela en trois lignes, et la logique de génération reste inchangée.

//fibonacci series based on the user input
import java.util.Scanner;

public class FibonacciUserInput {

    public static void main(String[] args)
    {
        int maxNumber = 0;
        int previousNumber = 0;
        int nextNumber = 1;

        System.out.println("How many numbers you want in Fibonacci:");
        Scanner scanner = new Scanner(System.in);
        maxNumber = scanner.nextInt();
        System.out.print("Fibonacci Series of " + maxNumber + " numbers:");

        for (int i = 1; i <= maxNumber; ++i)
        {
            System.out.print(previousNumber + " ");
            /* On each iteration, we are assigning the second number
             * to the first number and assigning the sum of the last two
             * numbers to the second number
             */

            int sum = previousNumber + nextNumber;
            previousNumber = nextNumber;
            nextNumber = sum;
        }

        scanner.close();
    }
}

Exemple d'exécution :

How many numbers you want in Fibonacci:
7
Fibonacci Series of 7 numbers:0 1 1 2 3 5 8

Logique du programme :
La logique est la même qu'auparavant. Au lieu de coder en dur le nombre d'éléments à afficher dans le Java Dans la suite de Fibonacci, l'utilisateur est invité à saisir un nombre.

Série de Fibonacci utilisant la récursivité dans Java

Vous trouverez ci-dessous un programme de série de Fibonacci en Java en utilisant la récursivité :

//Using Recursion
public class FibonacciCalc{
	public static int fibonacciRecursion(int n){
	if(n == 0){
		return 0;
	}
	if(n == 1 || n == 2){
			return 1;
		}
	return fibonacciRecursion(n-2) + fibonacciRecursion(n-1);
	}
    public static void main(String args[]) {
	int maxNumber = 10;
	System.out.print("Fibonacci Series of "+maxNumber+" numbers: ");
	for(int i = 0; i < maxNumber; i++){
			System.out.print(fibonacciRecursion(i) +" ");
		}
	}
}

Sortie :

Fibonacci Series of 10 numbers: 0 1 1 2 3 5 8 13 21 34

Logique du programme :

Une fonction récursive est une fonction qui a la capacité de s'appeler elle-même.

fibonacciRecursion() :

  1. Le Java La fonction de récursion de Fibonacci prend un nombre en entrée. Elle vérifie si ce nombre est 0, 1 ou 2 et renvoie respectivement 0, 1 et 1, car la suite de Fibonacci… Java commence par 0, 1, 1.
  2. Lorsque l'entrée n est supérieure ou égale à 3, la fonction s'appelle elle-même de manière récursive. L'appel est effectué deux fois. tracLe texte ci-dessous fait suite à l'appel pour une entrée de 4.
fibonacciRecursion(4)
    = fibonacciRecursion(2) + fibonacciRecursion(3)

    fibonacciRecursion(2) = 1                    // base case, no further calls
    fibonacciRecursion(3) = fibonacciRecursion(1) + fibonacciRecursion(2)
                          = 1 + 1
                          = 2

    Result: 1 + 2 = 3

Les cas de base interrompent la descente. Comme 1 et 2 retournent immédiatement, la branche de fibonacciRecursion(2) ne se développe jamais davantage, ce qui empêche la progression de se poursuivre. trace fini.

Suite de Fibonacci optimisée par mémoïsation

La récursivité simple recalcule les mêmes termes de nombreuses fois. Le calcul du terme 40 nécessite plus de 200 millions d'appels. Stocker chaque résultat lors de son premier calcul élimine complètement cette duplication.

public class FibonacciMemo {

    static long[] cache;

    public static long fib(int n) {
        if (n <= 1) {
            return n;
        }
        // return the stored value when it exists
        if (cache[n] != 0) {
            return cache[n];
        }
        cache[n] = fib(n - 1) + fib(n - 2);
        return cache[n];
    }

    public static void main(String[] args) {
        int maxNumber = 90;
        cache = new long[maxNumber + 1];

        System.out.println("Term 50 is: " + fib(50));
        System.out.println("Term 90 is: " + fib(90));
    }
}

Sortie :

Term 50 is: 12586269025
Term 90 is: 2880067194370816120

⚠️ Attention : Le 47e terme de Fibonacci est 2971215073, ce qui dépasse la limite maximale d'un entier (2147483647) et entraîne un retour à une valeur négative. Déclarez les variables comme des entiers longs (long) dès que le compte dépasse 46, puis passez au type BigInteger après le 92e terme.

Comparaison des méthodes de Fibonacci dans Java

Les quatre programmes impriment la même séquence, la décision dépend donc du nombre de termes nécessaires.

Méthode Complexité temporelle Complexité spatiale Limite pratique
Pour boucle O (n) O (1) Tout décompte, sous réserve du type numérique
Boucle while O (n) O (1) Tout décompte, sous réserve du type numérique
récursivité simple O(2ⁿ) Pile O(n) Environ 40 termes avant que cela ne devienne lent
Récursivité avec mémoïsation O (n) O (n) Tout décompte, sous réserve du type numérique

Le même schéma de compteur et d'accumulateur apparaît dans plusieurs exercices connexes. Continuez avec le Java programme palindrome, le Java programme pour vérifier si un nombre premierainsi que, Programme pour afficher les nombres premiers de 1 à 100Pour des exercices basés sur les tableaux, voir Bubble Trier dans Java et Java tableaux, et passez en revue le pour chaque boucle dans Java pour une syntaxe de boucle alternative.

FAQ

Les deux conventions existent. En informatique, on utilise généralement 0 et 1 comme premiers termes, ce que font ces programmes. Certains ouvrages de mathématiques commencent plutôt par 1.

Chaque appel en engendre deux autres, doublant ainsi la charge de travail à chaque terme supplémentaire. Les mêmes sous-problèmes sont résolus de manière répétée, ce qui entraîne une croissance exponentielle du nombre d'appels.

Un entier (int) peut contenir des termes jusqu'au nombre 46, et un entier long (long) peut contenir des termes jusqu'au nombre 92. Au-delà, un entier BigInteger est nécessaire car les valeurs dépassent 64 bits.

Les termes consécutifs se rapprochent du nombre d'or, soit environ 1.618. Ce motif apparaît dans la disposition des feuilles, les spirales des coquillages, les échelles d'estimation agiles et l'analyse technique en trading.

Ils renvoient souvent une récursion simple car c'est l'exemple le plus courant dans les manuels. Demandez explicitement une solution itérative ou avec mémorisation lorsque le nombre de termes est élevé.

Il s'agit du plus petit problème où le chevauchement des caches se produitping La résolution de sous-problèmes permet un gain de vitesse considérable. Ce même principe sous-tend la recherche mémorisée et la mise en cache des valeurs dans les algorithmes de planification en IA.

Résumez cet article avec :