Serie di Fibonacci in Java Utilizzo della ricorsione e dei cicli

⚡ Riepilogo intelligente

Serie di Fibonacci in Java genera una sequenza in cui ogni termine è uguale alla somma dei due termini che lo precedono. Questo articolo presenta cicli for, cicli while, input utente, ricorsivi e programmi con memorizzazione. traces la ricorsione e confronta la complessità temporale di ciascun approccio.

  • ➕ Regola fondamentale: Ogni termine è la somma dei due termini precedenti e la sequenza inizia con 0 e 1.
  • 🔁 Schema iterativo: Due variabili contengono i valori precedente e successivo, e una somma temporanea li sposta in avanti ad ogni passaggio.
  • 🌀 Schema ricorsivo: Il metodo richiama se stesso due volte per ogni termine, con 0, 1 e 2 che fungono da casi base.
  • ️ Divario di complessità: I cicli vengono eseguiti in tempo O(n), mentre la ricorsione ingenua viene eseguita in O(2ⁿ), che diventa inutilizzabile oltre circa 40 termini.
  • 🧠 Correzione della memorizzazione: La memorizzazione nella cache dei termini calcolati in un array ripristina il tempo lineare mentre mantieneping la struttura ricorsiva.
  • ⚠️ Limite di sovraccarico: Il 47° termine supera l'intervallo degli interi, quindi per sequenze più lunghe è necessario utilizzare long o BigInteger.
  • ️ Input dell'utente: La classe Scanner legge il conteggio desiderato in fase di esecuzione senza modificare alcuna logica di generazione.

Serie di Fibonacci in Java

In cosa consiste la serie di Fibonacci Java?

A Serie di Fibonacci in Java La successione di Fibonacci è una serie di numeri in cui il numero successivo è la somma dei due numeri precedenti. I primi due numeri della successione di Fibonacci sono 0 e 1. I numeri di Fibonacci sono ampiamente utilizzati nello studio computazionale dei tempi di esecuzione dell'algoritmo che determina il massimo comune divisore di due numeri interi.

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

Espressa come formula, la regola è F(n) = F(n-1) + F(n-2), con F(0) = 0 e F(1) = 1. La tabella seguente mostra come vengono prodotti i primi otto termini.

Posizione (n) Calcolo Valore
0 Caso base 0
1 Caso 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

Programma della serie di Fibonacci in Java utilizzando il ciclo For

La versione iterativa mantiene in memoria solo due valori alla volta, motivo per cui la sua esecuzione ha una complessità temporale lineare e un'efficienza spaziale costante.

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

Produzione:

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

Logica del programma:

  • previousNumber viene inizializzato a 0 e nextNumber viene inizializzato a 1.
  • Il ciclo for di Fibonacci itera attraverso maxNumber:
    • Visualizza il numero precedente.
    • Calcola la somma di previousNumber e nextNumber.
    • Aggiorna i nuovi valori di previousNumber e nextNumber.

Programma della serie di Fibonacci in Java utilizzando il ciclo While

Puoi anche generare un Java serie di Fibonacci utilizzando un while entrare JavaI calcoli sono identici, cambia solo la sintassi del ciclo.

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

	}

}

Produzione:

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

L'unica differenza nella logica del programma è l'utilizzo di un ciclo while per stampare i numeri di Fibonacci. Il contatore deve essere dichiarato prima del ciclo e incrementato al suo interno, altrimenti il ​​ciclo non termina mai.

Serie di Fibonacci basate sull'input dell'utente

Inserire manualmente il conteggio dei termini è comodo per una dimostrazione, ma negli esercizi reali il valore viene solitamente letto da tastiera. La classe Scanner gestisce questa operazione in tre righe, e la logica di generazione rimane invariata.

//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();
    }
}

Esecuzione di esempio:

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

Logica del programma:
La logica è la stessa di prima. Invece di codificare in modo fisso il numero di elementi da mostrare nel Java Serie di Fibonacci: all'utente viene chiesto di inserire un numero.

Serie di Fibonacci utilizzando la ricorsione in Java

Di seguito è riportato un programma della serie di Fibonacci in Java utilizzando la ricorsione:

//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) +" ");
		}
	}
}

Produzione:

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

Logica del programma:

Una funzione ricorsiva è una funzione che ha la capacità di richiamare se stessa.

ricorsione di fibonacci():

  1. Migliori Java La funzione ricorsiva di Fibonacci prende un numero in input. Controlla se è 0, 1 e 2 e restituisce rispettivamente 0, 1, 1, perché la sequenza di Fibonacci in Java inizia con 0, 1, 1.
  2. Quando l'input n è 3 o maggiore, la funzione chiama se stessa ricorsivamente. La chiamata viene effettuata due volte. trace di seguito segue la richiesta di un input di 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

I casi base arrestano la discesa. Poiché 1 e 2 restituiscono entrambi immediatamente, il ramo per fibonacciRecursion(2) non si espande mai ulteriormente, ed è questo che mantiene il trace finito.

Serie di Fibonacci ottimizzata tramite memorizzazione

La ricorsione semplice ricalcola gli stessi termini molte volte. Il calcolo del termine 40 richiede oltre 200 milioni di chiamate. Memorizzare ogni risultato la prima volta che viene calcolato elimina completamente questa duplicazione.

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

Produzione:

Term 50 is: 12586269025
Term 90 is: 2880067194370816120

⚠️ Attenzione: Il 47° termine di Fibonacci è 2971215073, che supera il valore massimo di 2147483647 e va a capo con un valore negativo. Dichiara le variabili come long una volta che il conteggio supera 46 e passa a BigInteger dopo il termine 92.

Confronto dei metodi di Fibonacci in Java

Tutti e quattro i programmi stampano la stessa sequenza, quindi la decisione dipende dal numero di termini necessari.

Metodo Complessità temporale Complessità spaziale Limite pratico
Per loop O (n) O (1) Qualsiasi conteggio, soggetto al tipo numerico
Mentre loop O (n) O (1) Qualsiasi conteggio, soggetto al tipo numerico
Ricorsione semplice O(2ⁿ) Stack O(n) Circa 40 termini prima che diventi lento
Ricorsione con memorizzazione O (n) O (n) Qualsiasi conteggio, soggetto al tipo numerico

Lo stesso schema di contatore e accumulatore appare in diversi esercizi correlati. Continua con il Java programma palindromo, il Java programma per verificare un numero primo Programma per stampare i numeri primi da 1 a 100Per la pratica basata sugli array, vedere Bubble Ordina in Java and Java array, e rivedere il per ogni ciclo in Java per una sintassi di ciclo alternativa.

DOMANDE FREQUENTI

Entrambe le convenzioni esistono. In informatica si usano normalmente 0 e 1 come primi due termini, ed è quello che fanno questi programmi. Alcuni testi di matematica, invece, iniziano con 1 e 1.

Ogni chiamata ne genera altre due, quindi il lavoro raddoppia a ogni termine aggiuntivo. Gli stessi sottoproblemi vengono risolti ripetutamente, il che produce una crescita esponenziale del numero di chiamate.

Un tipo int può contenere valori fino al numero 46, mentre un tipo long può contenere valori fino al numero 92. Oltre tale limite, è necessario utilizzare un tipo BigInteger poiché i valori superano i 64 bit.

I termini consecutivi si avvicinano alla sezione aurea, circa 1.618. Questo schema si ritrova nella disposizione delle foglie, nelle spirali delle conchiglie, nelle scale di stima agile e nell'analisi tecnica applicata al trading.

Spesso viene restituita la ricorsione semplice perché è l'esempio più comune nei libri di testo. Richiedete esplicitamente una soluzione iterativa o con memorizzazione quando il numero di termini è elevato.

È il problema più piccolo in cui la cache si sovrapponeping I sottoproblemi producono un notevole aumento di velocità. Lo stesso principio è alla base della ricerca con memorizzazione e della memorizzazione nella cache dei valori negli algoritmi di pianificazione dell'IA.

Riassumi questo post con: