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.

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