Szereg Fibonacciego w Java korzystanie z rekurencji i pętli

⚡ Inteligentne podsumowanie

Szereg Fibonacciego w Java Generuje sekwencję, w której każdy wyraz jest równy sumie dwóch poprzednich. W tym artykule przedstawiono pętlę for, pętlę while, programy z danymi wprowadzanymi przez użytkownika, programy rekurencyjne i programy z pamięcią. tracprzedstawia rekurencję i porównuje złożoność czasową każdego podejścia.

  • Zasada podstawowa: Każdy wyraz jest sumą dwóch poprzednich wyrazów, a sekwencja zaczyna się od 0 i 1.
  • 🔁 Wzorzec iteracyjny: Dwie zmienne przechowują poprzednią i następną wartość, a tymczasowa suma przesuwa je do przodu przy każdym przejściu.
  • 🌀 Wzór rekurencyjny: Metoda wywołuje samą siebie dwa razy na semestr, przy czym 0, 1 i 2 stanowią przypadki bazowe.
  • ⏱️. Luka złożoności: Pętle działają w czasie O(n), podczas gdy rekurencja naiwna działa w czasie O(2ⁿ), co staje się bezużyteczne po przekroczeniu 40 wyrazów.
  • ???? Naprawiono zapamiętywanie: Buforowanie obliczonych terminów w tablicy przywraca liniowy czas, podczas gdyping struktura rekurencyjna.
  • ⚠️ Limit przepełnienia: 47. wyraz przekracza zakres int, więc w przypadku dłuższych sekwencji wymagane jest użycie typu long lub BigInteger.
  • ⌨️. Dane wejściowe użytkownika: Klasa Scanner odczytuje żądaną liczbę w czasie wykonywania, nie zmieniając żadnej logiki generowania.

Szereg Fibonacciego w Java

Na czym polega ciąg Fibonacciego Java?

A Seria Fibonacciego in Java Ciąg Fibonacciego to ciąg liczb, w którym kolejna liczba jest sumą dwóch poprzednich. Pierwsze dwie liczby ciągu Fibonacciego to 0 i 1. Liczby Fibonacciego są szeroko wykorzystywane w badaniach nad algorytmem obliczającym największy wspólny dzielnik dwóch liczb całkowitych.

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

Wyrażona jako wzór reguła ma postać F(n) = F(n-1) + F(n-2), gdzie F(0) = 0, a F(1) = 1. Poniższa tabela pokazuje, jak powstaje pierwszych osiem wyrazów.

Pozycja (n) Obliczenie Wartość:
0 Przypadek podstawowy 0
1 Przypadek podstawowy 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

Program szeregu Fibonacciego w Java za pomocą pętli For

Wersja iteracyjna przechowuje w pamięci tylko dwie wartości w danym momencie, dlatego też działa w liniowym czasie i stałej przestrzeni.

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

Wyjście:

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

Logika programu:

  • previousNumber jest inicjowany wartością 0, a nextNumber jest inicjowany wartością 1.
  • Pętla Fibonacciego iteruje przez maxNumber:
    • Wyświetl poprzedniNumer.
    • Oblicz sumę previousNumber i nextNumber.
    • Zaktualizuj nowe wartości previousNumber i nextNumber.

Program szeregu Fibonacciego w Java za pomocą pętli While

Możesz również wygenerować Java Ciąg Fibonacciego za pomocą while pętla w Java. Arytmetyka jest identyczna, zmienia się jedynie składnia pętli.

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

	}

}

Wyjście:

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

Jedyną różnicą w logice programu jest użycie pętli while do wydrukowania liczb Fibonacciego. Licznik musi zostać zadeklarowany przed pętlą i inkrementowany w jej obrębie, w przeciwnym razie pętla nigdy się nie zakończy.

Szereg Fibonacciego na podstawie danych wejściowych użytkownika

Zakodowanie liczby terminów na stałe jest wygodne w demonstracji, ale w rzeczywistych ćwiczeniach wartość jest zazwyczaj odczytywana z klawiatury. Klasa Scanner obsługuje to w trzech linijkach, a logika generowania pozostaje nienaruszona.

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

Przykładowy przebieg:

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

Logika programu:
Logika jest taka sama jak wcześniej. Zamiast na stałe kodować liczbę elementów do wyświetlenia w Java Ciąg Fibonacciego, użytkownik proszony jest o wprowadzenie liczby.

Szereg Fibonacciego wykorzystujący rekurencję w Java

Poniżej znajduje się program ciągu Fibonacciego w formacie Java używając rekurencji:

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

Wyjście:

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

Logika programu:

Funkcja rekurencyjna to taka, która może wywołać samą siebie.

fibonacciRecursion():

  1. Java Funkcja rekurencji Fibonacciego przyjmuje liczbę wejściową. Sprawdza, czy jest ona równa 0, 1 i 2, i zwraca odpowiednio 0, 1, 1, ponieważ ciąg Fibonacciego w Java zaczyna się od 0, 1, 1.
  2. Gdy wartość wejściowa n jest równa 3 lub większa, funkcja wywołuje samą siebie rekurencyjnie. Wywołanie jest wykonywane dwukrotnie. tracPoniżej następuje prośba o podanie wartości wejściowej 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

Przypadki bazowe zatrzymują spadek. Ponieważ zarówno 1, jak i 2 zwracają się natychmiast, gałąź dla rekurencji Fibonacci(2) nigdy nie rozszerza się dalej, co powoduje, że trace skończony.

Zoptymalizowany ciąg Fibonacciego z wykorzystaniem memoizacji

Zwykła rekurencja wielokrotnie przelicza te same wyrazy. Obliczenie wyrazu 40 wymaga ponad 200 milionów wywołań. Zapisanie każdego wyniku przy pierwszym obliczeniu całkowicie eliminuje duplikację.

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

Wyjście:

Term 50 is: 12586269025
Term 90 is: 2880067194370816120

⚠️ Ostrzeżenie: 47. wyraz Fibonacciego to 2971215073, co przekracza maksymalną liczbę całkowitą 2147483647 i przyjmuje wartość ujemną. Zadeklaruj zmienne jako long, gdy liczba przekroczy 46, i przełącz się na BigInteger po wyrazie 92.

Porównanie metod Fibonacciego w Java

Wszystkie cztery programy drukują tę samą sekwencję, więc decyzja zależy od tego, ile wyrazów jest potrzebnych.

Metoda wykonania Złożoność czasowa Złożoność przestrzeni Praktyczna granica
Dla pętli Na) O (1) Dowolna liczba, zależna od typu liczbowego
Podczas pętli Na) O (1) Dowolna liczba, zależna od typu liczbowego
Prosta rekurencja O(2ⁿ) Stos O(n) Około 40 terminów, zanim zrobi się wolniej
Rekursja z pamięcią Na) Na) Dowolna liczba, zależna od typu liczbowego

Ten sam wzór licznika i akumulatora pojawia się w kilku powiązanych ćwiczeniach. Kontynuuj z Java program palindromowyThe Java program do sprawdzania liczby pierwszeji program do drukowania liczb pierwszych od 1 do 100. Aby zapoznać się z ćwiczeniami opartymi na tablicach, zobacz Bubble Sortuj w Java oraz Java tablicei przejrzyj dla każdej pętli w Java dla alternatywnej składni pętli.

FAQ

Istnieją obie konwencje. Informatyka zazwyczaj używa 0 i 1 jako pierwszych dwóch członów, co jest zgodne z działaniem tych programów. Niektóre teksty matematyczne zaczynają się od 1 i 1.

Każde wywołanie generuje dwa kolejne, więc praca podwaja się z każdym dodatkowym terminem. Te same podproblemy są rozwiązywane wielokrotnie, co powoduje wykładniczy wzrost liczby wywołań.

Typ int przechowuje wyrazy do liczby 46, a typ long przechowuje wyrazy do liczby 92. Powyżej tej liczby wymagany jest typ BigInteger, ponieważ wartości przekraczają 64 bity.

Kolejne wyrazy zbliżają się do złotego podziału, wynoszącego około 1.618. Formacja ta pojawia się w układzie liści, spiralach muszli, skalach estymacji zwinnych oraz analizie technicznej w tradingu.

Często zwracają prostą rekurencję, ponieważ jest to najczęstszy przykład z podręcznika. Poproś wprost o rozwiązanie iteracyjne lub zapamiętywane, gdy liczba terminów jest duża.

To najmniejszy problem, w którym występuje nakładanie się buforowaniaping Podproblemy generują znaczący wzrost szybkości. Ta sama zasada leży u podstaw wyszukiwania pamięciowego i buforowania wartości w algorytmach planowania AI.

Podsumuj ten post następująco: