Fibonaccijev niz u Java korištenje rekurzije i petlji
⚡ Pametni sažetak
Fibonaccijev niz u Java generira niz gdje je svaki član jednak zbroju dvaju članova prije njega. Ovaj članak predstavlja petlju for, petlju while, korisnički unos, rekurzivne i memoizirane programe, tracanalizira rekurziju i uspoređuje vremensku složenost svakog pristupa.

U čemu je Fibonaccijev niz Java?
A Fibonaccijeva serija in Java je niz brojeva u kojem je sljedeći broj zbroj prethodna dva broja. Prva dva broja Fibonaccijevog niza su 0 i 1. Fibonaccijevi brojevi se značajno koriste u računalnoj studiji algoritma koji određuje najveći zajednički djelitelj dvaju cijelih brojeva.
The Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, ...
Izraženo kao formula, pravilo je F(n) = F(n-1) + F(n-2), gdje je F(0) = 0 i F(1) = 1. Tablica u nastavku prikazuje kako se dobiva prvih osam članova.
| Položaj (n) | Računica | Još malo brojeva |
|---|---|---|
| 0 | Osnovni slučaj | 0 |
| 1 | Osnovni slučaj | 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 Fibonaccijevog niza u Java koristeći For Loop
Iterativna verzija u svakom trenutku čuva samo dvije vrijednosti u memoriji, zbog čega se izvršava u linearnom vremenu i konstantnom 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;
}
}
}
Izlaz:
Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34
Programska logika:
- prethodniBroj je inicijaliziran na 0, a sljedećiBroj je inicijaliziran na 1.
- Fibonaccijeva for petlja iterira kroz
maxNumber:- Prikaži prethodni broj.
- Izračunaj zbroj prethodnogBroj i sljedećegBroj.
- Ažurirajte nove vrijednosti prethodniNumber i sljedećiNumber.
Program Fibonaccijevog niza u Java pomoću while petlje
Također možete generirati Java Fibonaccijev niz pomoću while petlja unutra JavaAritmetika je identična, a mijenja se samo sintaksa petlje.
//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++;
}
}
}
Izlaz:
Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34
Jedina razlika u programskoj logici je korištenje while petlje za ispis Fibonaccijevih brojeva. Brojač mora biti deklariran prije petlje i inkrementiran unutar nje, inače petlja nikada ne završava.
Fibonaccijev niz na temelju korisničkog unosa
Tvrdo kodiranje broja termina je praktično za demonstraciju, ali stvarne vježbe obično čitaju vrijednost s tipkovnice. Klasa Scanner to obrađuje u tri retka, a logika generiranja ostaje netaknuta.
//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(); } }
Uzorak:
How many numbers you want in Fibonacci: 7 Fibonacci Series of 7 numbers:0 1 1 2 3 5 8
Programska logika:
Logika je ista kao i ranije. Umjesto fiksnog kodiranja broja elemenata koji će se prikazati u Java Fibonaccijev niz, od korisnika se traži da unese broj.
Fibonaccijev niz koji koristi rekurziju Java
Ispod je program Fibonaccijevog niza u Java koristeći rekurziju:
//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) +" ");
}
}
}
Izlaz:
Fibonacci Series of 10 numbers: 0 1 1 2 3 5 8 13 21 34
Programska logika:
Rekurzivna funkcija je ona koja ima sposobnost pozivanja same sebe.
fibonaccijeva rekurzija():
- The Java Fibonaccijeva rekurzijska funkcija prima ulazni broj. Provjerava 0, 1 i 2 te vraća 0, 1 i 1 respektivno, jer je Fibonaccijev niz u Java počinje s 0, 1, 1.
- Kada je ulazni n 3 ili veći, funkcija rekurzivno poziva samu sebe. Poziv se vrši dva puta. tracDolje navedeno slijedi poziv za unos broja 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
Osnovni slučajevi zaustavljaju spuštanje. Budući da se 1 i 2 odmah vraćaju, grana za fibonacciRecursion(2) se nikada ne širi dalje, što održava trackonačan.
Optimizirani Fibonaccijev niz korištenjem memoizacije
Obična rekurzija ponovno izračunava iste članove mnogo puta. Izračunavanje članka 40 zahtijeva više od 200 milijuna poziva. Pohranjivanje svakog rezultata pri prvom izračunu u potpunosti uklanja to dupliciranje.
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)); } }
Izlaz:
Term 50 is: 12586269025 Term 90 is: 2880067194370816120
⚠️ Upozorenje: 47. Fibonaccijev član je 2971215073, što premašuje maksimalni cijeli broj od 2147483647 i pretvara se u negativnu vrijednost. Deklarirajte varijable do duljine nakon što broj prijeđe 46 i prebacite se na BigInteger nakon članka 92.
Usporedba Fibonaccijevih metoda u Java
Sva četiri programa ispisuju isti niz, tako da odluka ovisi o tome koliko je termina potrebno.
| način | Složenost vremena | Složenost prostora | Praktična granica |
|---|---|---|---|
| Za petlju | O (n) | O (1) | Bilo koji broj, ovisno o numeričkom tipu |
| Dok petlja | O (n) | O (1) | Bilo koji broj, ovisno o numeričkom tipu |
| Obična rekurzija | O(2ⁿ) | O(n) stog | Oko 40 mandata prije nego što postane sporo |
| Rekurzija s memoizacijom | O (n) | O (n) | Bilo koji broj, ovisno o numeričkom tipu |
Isti obrazac brojača i akumulatora pojavljuje se u nekoliko povezanih vježbi. Nastavite s Java palindromski program je Java program za provjeru prostih brojeva, A program za ispis prostih brojeva od 1 do 100Za praksu temeljenu na nizovima, pogledajte Bubble Sortiraj Java i Java nizovii pregledajte za svaku petlju u Java za alternativnu sintaksu petlje.
