Série Fibonacci in Java použití rekurze a smyček

⚡ Chytré shrnutí

Série Fibonacci in Java generuje posloupnost, kde každý člen se rovná součtu dvou členů před ním. Tento článek popisuje cyklus for, cyklus while, uživatelský vstup, rekurzivní a memoizované programy. tracanalyzuje rekurzi a porovnává časovou složitost každého přístupu.

  • ➕ Základní pravidlo: Každý člen je součtem dvou předchozích členů a posloupnost začíná 0 a 1.
  • 🔁 Iterativní vzor: Dvě proměnné obsahují předchozí a následující hodnotu a dočasný součet je při každém průchodu posouvá dopředu.
  • ???? Rekurzivní vzor: Metoda se volá dvakrát za každý term, přičemž 0, 1 a 2 slouží jako základní případy.
  • ⏱️ Mezera v komplexnosti: Smyčky běží v čase O(n), zatímco naivní rekurze běží v čase O(2ⁿ), což se stává nepoužitelným po zhruba 40 termínech.
  • 🧠 Oprava memoizace: Ukládání vypočítaných členů do mezipaměti v poli obnovuje lineární čas a zároveň uchováváping rekurzivní struktura.
  • ⚠️ Limit přetečení: 47. člen přesahuje rozsah celých čísel, takže pro delší sekvence je vyžadován typ long nebo BigInteger.
  • ⌨️ Uživatelský vstup: Třída Scanner načte požadovaný počet za běhu, aniž by změnila logiku generování.

Série Fibonacci in Java

V čem je Fibonacci Series Java?

A Fibonacciho série in Java je řada čísel, ve které je následující číslo součtem dvou předchozích čísel. První dvě čísla Fibonacciho řady jsou 0 a 1. Fibonacciho čísla se významně používají při výpočetním studiu algoritmu, který určuje největšího společného dělitele dvou celých čísel.

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

Vyjádřeno jako vzorec, pravidlo je F(n) = F(n-1) + F(n-2), kde F(0) = 0 a F(1) = 1. Tabulka níže ukazuje, jak se vypočítá prvních osm členů.

Pozice (n) Výpočet Hodnota
0 Základní případ 0
1 Základní případ 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 Fibonacci Series v Java pomocí For Loop

Iterativní verze uchovává v paměti v každém okamžiku pouze dvě hodnoty, a proto běží v lineárním čase a konstantním prostoru.

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

Výstup:

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

Programová logika:

  • předchozíČíslo je inicializováno na 0 a dalšíČíslo je inicializováno na 1.
  • Fibonacciho smyčka for iteruje skrz maxNumber:
    • Zobrazit předchozíČíslo.
    • Vypočítejte součet předchozíhoČísla a dalšíhoČísla.
    • Aktualizujte nové hodnoty proměnných previousNumber a nextNumber.

Program Fibonacci Series v Java pomocí While Loop

Můžete také vygenerovat Java Fibonacciho řada s využitím while smyčka dovnitř JavaAritmetika je identická a mění se pouze syntaxe smyčky.

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

	}

}

Výstup:

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

Jediný rozdíl v logice programu spočívá v použití smyčky while pro výpis Fibonacciho čísel. Čítač musí být deklarován před smyčkou a uvnitř ní inkrementován, jinak smyčka nikdy nekončí.

Fibonacci řada na základě uživatelského vstupu

Pevné kódování počtu termínů je vhodné pro demonstraci, ale skutečná cvičení obvykle čtou hodnotu z klávesnice. Třída Scanner to zpracovává ve třech řádcích a logika generování zůstává nedotčena.

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

Ukázkový běh:

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

Programová logika:
Logika je stejná jako dříve. Místo pevného kódování počtu prvků, které se mají zobrazit v Java Fibonacciho řada, uživatel je požádán o zadání čísla.

Fibonacciho řada využívající rekurzi v Java

Níže je uveden program řady Fibonacci Java pomocí rekurze:

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

Výstup:

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

Programová logika:

Rekurzivní funkce je taková, která má schopnost volat sama sebe.

FibonacciRecursion():

  1. Jedno Java Fibonacciho rekurzní funkce přijímá vstupní číslo. Kontroluje 0, 1 a 2 a vrací 0, 1, 1, protože Fibonacciho posloupnost v Java začíná 0, 1, 1.
  2. Pokud je vstupní hodnota n 3 nebo větší, funkce se rekurzivně volá. Volání se provede dvakrát. tracNíže uvedený příklad následuje po výzvě k zadání čísla 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

Základní případy zastavují sestup. Protože se 1 a 2 vracejí okamžitě, větev pro fibonacciRecursion(2) se nikdy dále nerozvine, což udržuje trace konečný.

Optimalizovaná Fibonacciho řada s využitím memoizace

Prostá rekurze mnohokrát přepočítává stejné členy. Výpočet 40. členu vyžaduje více než 200 milionů volání. Uložení každého výsledku při prvním výpočtu tuto duplicitu zcela odstraní.

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

Výstup:

Term 50 is: 12586269025
Term 90 is: 2880067194370816120

Warning️ Varování: 47. člen Fibonacciho součtu je 2971215073, což překračuje celočíselné maximum 2147483647 a hodnota se zalomí na zápornou. Jakmile počet překročí 46, deklarujte proměnné s trvalou hodnotou `long` a po 92. členu přepněte na `BigInteger`.

Porovnání Fibonacciho metod v Java

Všechny čtyři programy vytisknou stejnou sekvenci, takže rozhodnutí závisí na tom, kolik členů je potřeba.

Metoda Časová složitost Složitost vesmíru Praktický limit
Pro smyčku O (n) O (1) Libovolný počet, v závislosti na číselném typu
Zatímco smyčka O (n) O (1) Libovolný počet, v závislosti na číselném typu
Jednoduchá rekurze O(2ⁿ) O(n) zásobník Asi 40 období, než se to zpomalí
Rekurze s memoizací O (n) O (n) Libovolný počet, v závislosti na číselném typu

Stejný vzorec čítače a akumulátoru se objevuje v několika souvisejících cvičeních. Pokračujte s Java palindromový programse Java program pro kontrolu prvočíslaA program pro výpis prvočísel od 1 do 100Pro praxi založenou na polích viz Bubble Seřadit Java a Java polea zkontrolujte pro každou smyčku v Java pro alternativní syntaxi smyčky.

Nejčastější dotazy

Existují obě konvence. Informatika obvykle používá jako první dva členy 0 a 1, což tyto programy dělají. Některé matematické texty začínají čísly 1 a 1.

Každé volání spustí další dvě volání, takže práce se s každým dalším členem zdvojnásobuje. Stejné dílčí problémy se řeší opakovaně, což vede k exponenciálnímu růstu počtu volání.

Typ int obsahuje termíny až do čísla 46 a typ long obsahuje termíny až do čísla 92. Kromě toho je vyžadován BigInteger, protože hodnoty přesahují 64 bitů.

Po sobě jdoucí členy se blíží zlatému řezu, zhruba 1.618. Tento vzorec se objevuje v uspořádání listů, spirálách skořápek, agilních odhadovacích stupnicích a technické analýze v obchodování.

Často vracejí prostou rekurzi, protože je to nejběžnější učebnicový příklad. Pokud je počet termínů velký, požádejte explicitně o iterativní nebo memoizované řešení.

Je to nejmenší problém, kde se ukládání do mezipaměti překrýváping dílčí problémy produkují dramatický nárůst rychlosti. Stejný princip je základem pro vyhledávání s využitím paměti a ukládání hodnot do mezipaměti v plánovacích algoritmech s využitím umělé inteligence.

Shrňte tento příspěvek takto: