recursion java tutorial with examples
Ovaj produbljeni vodič o rekurziji na Javi objašnjava što je rekurzija s primjerima, vrstama i povezanim konceptima. Također obuhvaća rekurziju protiv ponavljanja:
Iz naših ranijih tutorijala na Javi vidjeli smo iterativni pristup u kojem deklariramo petlju i zatim na iterativni način prelazimo kroz strukturu podataka uzimajući jedan po jedan element.
Također smo vidjeli uvjetni tok gdje opet zadržavamo jednu varijablu petlje i ponavljamo dio koda dok varijabla petlje ne zadovolji uvjet. Kada je riječ o pozivima funkcija, istražili smo iterativni pristup i za pozive funkcija.
=> Ovdje provjerite SVE Java tutorijale.
U ovom uputstvu razgovarat ćemo o drugačijem pristupu programiranju, tj. Rekurzivnom pristupu.
Što ćete naučiti:
- Što je rekurzija u Javi?
- Rekurzija protiv iteracije u Javi
- Zaključak
Što je rekurzija u Javi?
Rekurzija je postupak kojim se funkcija ili metoda iznova i iznova poziva. Ova se funkcija koja se uvijek iznova ili izravno ili neizravno naziva 'rekurzivna funkcija'.
Vidjet ćemo razne primjere za razumijevanje rekurzije. Sada da vidimo sintaksu rekurzije.
Sintaksa rekurzije
Bilo koja metoda koja provodi rekurziju ima dva osnovna dijela:
- Poziv metode koji se može nazvati tj. Rekurzivno
- Preduvjet koji će zaustaviti rekurziju.
Imajte na umu da je preduvjet potreban za bilo koju rekurzivnu metodu, jer ako ne prekinemo rekurziju, ona će se nastaviti beskrajno izvoditi i rezultirati preljevom stoga.
Opća sintaksa rekurzije je sljedeća:
methodName (T parameters…) { if (precondition == true) //precondition or base condition { return result; } return methodName (T parameters…); //recursive call }
Imajte na umu da se preduvjet naziva i osnovnim uvjetom. O osnovnom stanju razgovarat ćemo u sljedećem odjeljku.
Razumijevanje rekurzije u Javi
U ovom ćemo odjeljku pokušati razumjeti proces rekurzije i vidjeti kako se odvija. Naučit ćemo o osnovnom stanju, prelijevanju stoga i vidjeti kako se određeni problem može riješiti rekurzijom i ostalim takvim detaljima.
koji je najbolji softver za baze podataka
Osnovno stanje rekurzije
Dok pišemo rekurzivni program, prvo bismo trebali pružiti rješenje za osnovni slučaj. Tada veći problem izražavamo manjim problemima.
Kao an primjer, možemo uzeti klasični problem izračunavanja faktorijela broja. S obzirom na broj n, moramo pronaći faktorijel od n označen s n!
Sada ćemo implementirati program za izračunavanje n faktora (n!) Pomoću rekurzije.
public class Main{ static int fact(int n) { if (n == 1) // base condition return 1; else return n*fact(n-1); } public static void main(String[] args) { int result = fact(10); System.out.println('10! = ' + result); } }
Izlaz
U ovom programu možemo vidjeti da je uvjet (n<=1) is the base condition and when this condition is reached, the function returns 1. The else part of the function is the recursive call. But every time the recursive method is called, n is decremented by 1.
Stoga možemo zaključiti da će vrijednost n na kraju postati 1 ili manje od 1 i u ovom trenutku metoda će vratiti vrijednost 1. Taj će se osnovni uvjet postići i funkcija će se zaustaviti. Imajte na umu da vrijednost n može biti sve dok zadovoljava osnovni uvjet.
Rješavanje problema korištenjem rekurzije
Osnovna ideja korištenja rekurzije jest izraziti veći problem u smislu manjih problema. Također, moramo dodati jedan ili više osnovnih uvjeta kako bismo mogli izaći iz rekurzije.
To je već pokazano u gornjem faktorskom primjeru. U ovom smo programu izrazili n faktorijel (n!) U smislu manjih vrijednosti i imali osnovni uvjet (n<=1) so that when n reaches 1, we can quit the recursive method.
Pogreška prelijevanja steka u rekurziji
Svjesni smo da se kada se pozove bilo koja metoda ili funkcija, stanje funkcije pohranjuje se u stog i dohvaća kad se funkcija vrati. Stog se koristi i za rekurzivnu metodu.
Ali u slučaju rekurzije, problem bi se mogao dogoditi ako ne definiramo osnovno stanje ili kada osnovni uvjet nekako nije postignut ili izvršen. Ako se dogodi ova situacija, može doći do preljeva stoga.
Razmotrimo donji primjer faktorskog zapisa.
Ovdje smo dali pogrešan osnovni uvjet, n == 100.
public class Main { static int fact(int n) { if (n == 100) // base condition resulting in stack overflow return 1; else return n*fact(n-1); } public static void main(String[] args) { int result = fact(10); System.out.println('10! = ' + result); } }
Dakle, kada je n> 100, metoda će vratiti 1, ali rekurzija neće prestati. Vrijednost n neprestano će se smanjivati jer ne postoji drugi uvjet da se to zaustavi. To će se nastaviti dok se stog ne prelije.
Drugi će slučaj biti kada vrijednost n<100. In this case, as well the method will never execute the base condition and result in a stack overflow.
Primjeri rekurzije u Javi
U ovom ćemo odjeljku implementirati sljedeće primjere pomoću rekurzije.
# 1) Fibonaccijeve serije pomoću rekurzije
Fibonaccijevu seriju daje,
1,1,2,3,5,8,13,21,34,55, ...
Gornji slijed pokazuje da je trenutni element zbroj prethodna dva elementa. Također, prvi element u Fibonaccijevoj seriji je 1.
Dakle, općenito ako je n trenutni broj, tada se daje zbrojem (n-1) i (n-2). Kako se trenutni element izražava u terminima prethodnih elemenata, taj problem možemo izraziti rekurzijom.
Program za provedbu Fibonaccijeve serije dan je u nastavku:
public class Main { //method to calculate fibonacci series static int fibonacci(int n) { if (n <= 1) { return n; } return fibonacci(n-1) + fibonacci(n-2); } public static void main(String[] args) { int number = 10; //print first 10 numbers of fibonacci series System.out.println ('Fibonacci Series: First 10 numbers:'); for (int i = 1; i <= number; i++) { System.out.print(fibonacci(i) + ' '); } } }
Izlaz
# 2) Provjerite je li broj palindrom pomoću rekurzije
Palindrom je slijed koji je jednak kad ga čitamo slijeva udesno ili zdesna ulijevo.
S obzirom na broj 121, vidimo da je jednak kad ga čitamo slijeva udesno i zdesna ulijevo. Stoga je broj 121 palindrom.
Uzmimo drugi broj, 1242. Kad ga čitamo slijeva udesno, to je 1242, a kada ga čitamo zdesna ulijevo, on glasi kao 2421. Dakle, ovo nije palindrom.
Provodimo program palindroma obrćući znamenke brojeva i rekurzivno uspoređujemo zadani broj s njegovim obrnutim prikazom.
Program u nastavku implementira program za provjeru palindroma.
import java.io.*; import java.util.*; public class Main { // check if num contains only one digit public static int oneDigit(int num) { if ((num >= 0) && (num <10)) return 1; else return 0; } //palindrome utility function public static int isPalindrome_util (int num, int revNum) throws Exception { // base condition; return if num=0 if (num == 0) { return revNum; } else { //call utility function recursively revNum = isPalindrome_util(num / 10, revNum); } // Check if first digit of num and revNum are equal if (num % 10 == revNum % 10) { // if yes, revNum will move with num return revNum / 10; } else { // exit throw new Exception(); } } //method to check if a given number is palindrome using palindrome utility function public static int isPalindrome(int num) throws Exception { if (num < 0) num = (-num); int revNum = (num); return isPalindrome_util(num, revNum); } public static void main(String args[]) { int n = 1242; try { isPalindrome(n); System.out.println('Yes, the given number ' + n + ' is a palindrome.'); } catch (Exception e) { System.out.println('No, the given number ' + n + ' is not a palindrome.'); } n = 1221; try { isPalindrome(n); System.out.println('Yes, the given number ' + n + ' is a palindrome.'); } catch (Exception e) { System.out.println('No, the given number ' + n + ' is not a palindrome.'); } } }
Izlaz
# 3) Rekurzija niza obrnutog niza Java
S obzirom na niz 'Zdravo', moramo ga preokrenuti tako da rezultirajući niz bude 'olleH'.
To se radi pomoću rekurzije. Počevši od zadnjeg znaka u nizu, mi rekurzivno ispisujemo svaki znak sve dok se svi znakovi u nizu ne iscrpe.
Program u nastavku koristi rekurziju za preokretanje zadanog niza.
web mjesto koje vam omogućuje preuzimanje youtube videozapisa
class String_Reverse { //recursive method to reverse a given string void reverseString(String str) { //base condition; return if string is null or with 1 or less character if ((str==null)||(str.length() <= 1)) System.out.println(str); else { //recursively print each character in the string from the end System.out.print(str.charAt(str.length()-1)); reverseString(str.substring(0,str.length()-1)); } } } class Main{ public static void main(String[] args) { String inputstr = 'SoftwareTestingHelp'; System.out.println('The given string: ' + inputstr); String_Reverse obj = new String_Reverse(); System.out.print('The reversed string: '); obj.reverseString(inputstr); } }
Izlaz
# 4) Rekurzija binarnog pretraživanja Java
Binarni algoritam pretraživanja poznati je algoritam pretraživanja. U ovom algoritmu, s obzirom na razvrstani niz od n elemenata, pretražujemo taj niz za zadani ključni element. Na početku niz dijelimo na dvije polovice pronalaženjem srednjeg elementa niza.
Zatim, ovisno o tome je li tipka mid, ograničavamo pretraživanje u prvoj ili drugoj polovici niza. Na taj se način ponavlja isti postupak dok se ne pronađe mjesto ključnih elemenata.
Ovaj ćemo algoritam implementirati koristeći ovdje rekurziju.
import java.util.*; class Binary_Search { // recursive binary search int binarySearch(int numArray[], int left, int right, int key) { if (right >= left) { //calculate mid of the array int mid = left + (right - left) / 2; // if the key is at mid, return mid if (numArray[mid] == key) return mid; // if key key) return binarySearch(numArray, left, mid - 1, key); // Else recursively search in the right subarray return binarySearch(numArray, mid + 1, right, key); } // no elements in the array, return -1 return -1; } } class Main{ public static void main(String args[]) { Binary_Search ob = new Binary_Search(); //declare and print the array int numArray[] = { 4,6,12,16,22}; System.out.println('The given array : ' + Arrays.toString(numArray)); int len = numArray.length; //length of the array int key = 16; //key to be searched int result = ob.binarySearch(numArray, 0, len - 1, key); if (result == -1) System.out.println('Element ' + key + ' not present'); else System.out.println('Element ' + key + ' found at index ' + result); } }
Izlaz
# 5) Pronađi minimalnu vrijednost u nizu pomoću rekurzije
Koristeći rekurziju također možemo pronaći minimalnu vrijednost u polju.
Java program za pronalaženje minimalne vrijednosti u polju dat je u nastavku.
import java.util.*; class Main { static int getMin(int numArray[], int i, int n) { //return first element if only one element or minimum of the array elements return (n == 1) ? numArray[i] : Math.min(numArray[i], getMin(numArray,i + 1 , n - 1)); } public static void main(String[] args) { int numArray[] = { 7,32,64,2,10,23 }; System.out.println('Given Array : ' + Arrays.toString(numArray)); int n = numArray.length; System.out.print('Minimum element of array: ' + getMin(numArray, 0, n) + '
'); } }
Izlaz
Ovo su neki od primjera rekurzije. Osim ovih primjera, mnoštvo drugih problema u softveru može se implementirati rekurzivnim tehnikama.
Vrste rekurzije
Rekurzija je dvije vrste na temelju trenutka kada je upućen poziv rekurzivnoj metodi.
Oni su:
# 1) Rekurzija repa
Kada je poziv rekurzivnoj metodi posljednji izraz izveden unutar rekurzivne metode, naziva se 'Rekurzija repa'.
U rep rekurziji, rekurzivni izraz poziva obično se izvršava zajedno s povratnim izrazom metode.
Opća sintaksa za rekurziju repa navedena je u nastavku:
methodName ( T parameters…){ { if (base_condition == true) { return result; } return methodName (T parameters …) //tail recursion }
# 2) Rekurzija glave
Rekurzija glave je svaki rekurzivni pristup koji nije rekurzija repa. Dakle, čak je i opća rekurzija ispred rekurzije.
Sintaksa rekurzije glave je sljedeća:
methodName (T parameters…){ if (some_condition == true) { return methodName (T parameters…); } return result; }
Rekurzija protiv iteracije u Javi
Rekurzija | Iteracija |
---|---|
Složenost vremena vrlo je velika. | Složenost vremena relativno je s donje strane. |
Rekurzija je postupak u kojem se metoda više puta poziva dok se ne ispuni osnovni uvjet. | Iteracija je postupak kojim se dio koda opetovano izvršava konačan broj puta ili dok se ne ispuni uvjet. |
Je li aplikacija za funkcije. | Primjenjivo je na petlje. |
Dobro radi za manju veličinu koda. | Dobro radi za veću veličinu koda. |
Koristi više memorije dok se svaki rekurzivni poziv gura u stog | Koristi se relativno manje memorije. |
Teško otklanjanje pogrešaka i održavanje | Jednostavnije za uklanjanje pogrešaka i održavanje |
Rezultat je preljev steka ako osnovni uvjet nije naveden ili nije postignut. | Može se izvršavati beskonačno, ali u konačnici će zaustaviti izvršenje s bilo kojim pogreškama u memoriji |
Često postavljana pitanja
P # 1) Kako rekurzija radi na Javi?
Odgovor: U rekurziji se rekurzivna funkcija više puta poziva dok se ne zadovolji osnovni uvjet. Memorija za pozvanu funkciju gurne se na hrpu na vrhu memorije za pozivajuću funkciju. Za svaki poziv funkcije izrađuje se zasebna kopija lokalnih varijabli.
P # 2) Zašto se koristi rekurzija?
Odgovor: Rekurzija se koristi za rješavanje onih problema koji se mogu rastaviti na manje, a cijeli problem može se izraziti manjim problemom.
Rekurzija se također koristi za one probleme koji su suviše složeni da bi se mogli riješiti iterativnim pristupom. Osim problema za koje vremenska složenost nije problem, koristite rekurziju.
3. pitanje) Koje su prednosti rekurzije?
Odgovor:
Prednosti rekurzije uključuju:
- Rekurzija smanjuje suvišno pozivanje funkcije.
- Rekurzija nam omogućuje lako rješavanje problema u usporedbi s iterativnim pristupom.
P # 4) Koji je bolji - rekurzija ili ponavljanje?
Odgovor: Rekurzija ponavlja pozive dok se ne postigne osnovna funkcija. Stoga postoji memorija iznad, jer se memorija za svaki poziv funkcije gura na stog.
S druge strane, ponavljanje nema previše memorije. Izvođenje rekurzije je sporije od iterativnog pristupa. Rekurzija smanjuje veličinu koda dok iterativni pristup čini kôd velikim.
5. pitanje) Koje su prednosti rekurzije nad ponavljanjem?
Odgovor:
- Rekurzija čini kod jasnijim i kraćim.
- Rekurzija je bolja od iterativnog pristupa za probleme poput Hanojske kule, zaokretanja stabala itd.
- Kako svaki funkcijski poziv memoriju gura na hrpu, rekurzija koristi više memorije.
- Izvođenje rekurzije je sporije od iterativnog pristupa.
Zaključak
Rekurzija je vrlo važan koncept u softveru, bez obzira na programski jezik. Rekurzija se uglavnom koristi u rješavanju problema s strukturom podataka poput tornjeva Hanoja, prelaza stabala, povezanih popisa itd. Iako treba više memorije, rekurzija kôd čini jednostavnijim i jasnijim.
Sve o rekurziji istražili smo u ovom vodiču. Također smo implementirali brojne primjere programiranja za bolje razumijevanje koncepta.
=> Pročitajte seriju Easy Training Training.
Preporučena literatura
- Rekurzija u C ++
- Java Iterator: Naučite koristiti primjere iteratora u Javi s primjerima
- ListIterator sučelje u Javi s primjerima
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- Vodič za Java za petlju s primjerima programa
- Java While Loop - Vodič sa primjerima programiranja
- Java radi dok petlja - Vodič sa primjerima
- Nazubljeni niz u Javi - Vodič s primjerima