Fibonacci sorozat be Java Rekurzió és ciklusok használata

⚡ Okos összefoglaló

Fibonacci sorozat be Java egy olyan sorozatot generál, ahol minden tag egyenlő az előtte lévő két tag összegével. Ez a cikk a for ciklust, a while ciklust, a felhasználói bevitelt, a rekurzív és a memorizált programokat mutatja be. tracMeghatározza a rekurziót, és összehasonlítja az egyes megközelítések időbonyolultságát.

  • Alapszabály: Minden tag az előző két tag összege, és a sorozat 0-val és 1-gyel kezdődik.
  • 🔁 Iteratív minta: Két változó tartalmazza az előző és a következő értéket, és egy ideiglenes összeg minden menetben előre tolja őket.
  • 🌀 Rekurzív minta: A metódus kifejezésenként kétszer hívja meg magát, ahol a 0, 1 és 2 az alapesetek.
  • ⏱️ Komplexitási rés: A ciklusok O(n) idő alatt futnak, míg a naiv rekurzió O(2ⁿ) idő alatt, ami nagyjából 40 tag után használhatatlanná válik.
  • 🧠 Memorizációs javítás: A számított kifejezések gyorsítótárazása egy tömbben visszaállítja a lineáris időt, miközben a kee függvényt használjuk.ping a rekurzív szerkezet.
  • ⚠️ Túlcsordulási korlát: A 47. tag meghaladja az int tartományt, ezért hosszabb sorozatokhoz long vagy BigInteger szükséges.
  • ⌨️ Felhasználói bevitel: A Scanner osztály futásidőben beolvassa a kívánt darabszámot a generálási logika megváltoztatása nélkül.

Fibonacci sorozat be Java

Miben található a Fibonacci sorozat? Java?

A Fibonacci sorozat in Java egy olyan számsorozat, amelyben a következő szám az előző két szám összege. A Fibonacci-sorozat első két száma 0 és 1. A Fibonacci-számokat jelentősen felhasználják két egész szám legnagyobb közös osztóját meghatározó algoritmus számítógépes futásidejű vizsgálatában.

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

Képletként kifejezve a szabály: F(n) = F(n-1) + F(n-2), ahol F(0) = 0 és F(1) = 1. Az alábbi táblázat bemutatja, hogyan keletkezik az első nyolc tag.

Pozíció (n) Számítás Érték:
0 Alapeset 0
1 Alapeset 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

Fibonacci sorozat programja Java a For Loop használatával

Az iteratív változat egyszerre csak két értéket tárol a memóriában, ezért lineáris időben és konstans térben fut.

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

output:

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

Program logika:

  • Az előzőNumber inicializálása 0-ra, a következőNumber inicializálása pedig 1-re történik.
  • A Fibonacci for ciklus végigmegy a következőn: maxNumber:
    • Jelenítse meg az előző számot.
    • Számítsa ki az előzőNumber és a következőNumber összegét.
    • Frissítse az előzőNumber és a következőNumber új értékeit.

Fibonacci sorozat programja Java a While Loop használatával

Azt is generálhatod, hogy Java Fibonacci-sorozat egy while hurok be JavaA számtani műveletek megegyeznek, csak a ciklus szintaxisa változik.

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

	}

}

output:

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

A programlogikában az egyetlen különbség a Fibonacci-számok kinyomtatására szolgáló while ciklus használata. A számlálót a ciklus előtt kell deklarálni, és a cikluson belül növelni, különben a ciklus soha nem ér véget.

Fibonacci sorozat a felhasználói bevitel alapján

A count kifejezés fix kódolása praktikus egy bemutatóhoz, de a valódi gyakorlatokban általában a billentyűzetről olvassuk be az értéket. A Scanner osztály ezt három sorban kezeli, és a generálási logika érintetlen marad.

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

Minta futtatása:

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

Program logika:
A logika ugyanaz, mint korábban. Ahelyett, hogy fixen beprogramoznánk a megjelenítendő elemek számát Java Fibonacci-sorozat esetén a felhasználónak meg kell adnia egy számot.

Fibonacci sorozat a rekurzió használatával Java

Az alábbiakban egy Fibonacci sorozat programja látható Java rekurzió használatával:

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

output:

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

Program logika:

A rekurzív függvény az, amely képes meghívni önmagát.

fibonacciRecursion():

  1. Az Java A Fibonacci rekurziós függvény egy bemeneti számot fogad el. Ellenőrzi a 0, 1 és 2 értékeket, és rendre 0, 1 és 1 értéket ad vissza, mivel a Fibonacci-sorozat a következőben szerepel: Java 0, 1, 1-gyel kezdődik.
  2. Amikor az n bemenet 3 vagy nagyobb, a függvény rekurzívan hívja meg magát. A hívás kétszer történik. A tracAz alábbi e a 4-es beviteli felhívás után következik.
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

Az alapesetek megállítják az ereszkedést. Mivel az 1. és a 2. is azonnal visszatér, a FibonacciRecursion(2) ága soha nem bővül tovább, ami megtartja a tracvéges.

Optimalizált Fibonacci-sorozat memoizáció segítségével

A sima rekurzió ugyanazokat a tagokat sokszor újraszámolja. A 40-es tag kiszámítása több mint 200 millió hívást igényel. Ha minden eredményt az első kiszámításkor tárolunk, az teljesen megszünteti ezt a duplikációt.

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

output:

Term 50 is: 12586269025
Term 90 is: 2880067194370816120

⚠️ Figyelmeztetés: A 47. Fibonacci-tag 2971215073, amely meghaladja a 2147483647-es int maximumot, és negatív értékre tördel. A változókat 46-nál nagyobb számlálószám esetén deklaráljuk long-ig, a 92. tag után pedig BigInteger-re váltunk.

Fibonacci-módszerek összehasonlítása Java

Mind a négy program ugyanazt a sorozatot írja ki, így a döntés azon múlik, hogy hány tagra van szükség.

Módszer Idő komplexitás Tér komplexitás Gyakorlati korlát
Hurokhoz O (n) O (1) Bármely darabszám, a numerikus típustól függően
Miközben hurok O (n) O (1) Bármely darabszám, a numerikus típustól függően
Sima rekurzió O(2) O(n) verem Körülbelül 40 kifejezés, mielőtt lelassul
Rekurzió memoizációval O (n) O (n) Bármely darabszám, a numerikus típustól függően

Ugyanez a számláló és akkumulátor minta több kapcsolódó gyakorlatban is megjelenik. Folytasd a következővel: Java palindrom program, a Java prímszám-ellenőrző program, És a program prímszámok kiírására 1-től 100-igA tömbalapú gyakorláshoz lásd: BubblRendezés szerint Java és a Java tömbök, és tekintse át a minden egyes hurokhoz Java alternatív ciklusszintaxishoz.

GYIK

Mindkét konvenció létezik. A számítástechnika általában a 0-t és az 1-et használja első két tagként, és ezek a programok is ezt teszik. Néhány matematikai szöveg ehelyett 1-gyel és 1-gyel kezdődik.

Minden hívás két további hívást eredményez, így a munka minden további taggal megduplázódik. Ugyanazokat a részproblémákat oldjuk meg ismételten, ami a hívások számának exponenciális növekedését eredményezi.

Egy int típus 46-ig, egy long típus pedig 92-ig tartalmazza a tagokat. Ezen túlmenően a BigInteger szükséges, mivel az értékek meghaladják a 64 bitet.

Az egymást követő kifejezések megközelítik az aranymetszés arányát, ami nagyjából 1.618. A minta megjelenik a levélelrendezésben, a kagylóspirálokban, az agilis becslési skálákban és a kereskedésben használt technikai elemzésben.

Gyakran sima rekurziót adnak vissza, mivel ez a leggyakoribb tankönyvi példa. Explicit módon kérjen iteratív vagy memorandumként rögzített megoldást, ha a kifejezések száma nagy.

Ez a legkisebb probléma, ahol a gyorsítótár átfedésben van.ping Az alproblémák drámai sebességnövekedést eredményeznek. Ugyanez az elv alapozza meg a memoizált keresést és az érték-gyorsítótárazást a mesterséges intelligencia tervezési algoritmusaiban.

Foglald össze ezt a bejegyzést a következőképpen: