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.

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():
- 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.
- 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.
