rekurzije je postupak definiranja nečega u smislusebe. Kako se odnosi na Java programiranje, rekurzija je atribut koji omogućava da se metoda sama nazove. Kaže se da je metoda koja sebe poziva rekurzivnom i Java podržava rekurziju.
U početku ovo može izgledati kao beskonačna petlja,a čini se da naša metoda nikad neće završiti. To bi moglo biti istina u nekim slučajevima, ali u praksi možemo provjeriti je li određeno stanje istinito i u tom slučaju izbaciti (vratiti se) našu metodu. Slučaj u kojem završimo rekurziju naziva se a osnovni slučaj, Uz to, baš kao i u petlji, moramo promijeniti neku vrijednost i postupno se približiti našem osnovnom slučaju.
Svaka rekurzija trebala bi imati sljedeće karakteristike:
- Jednostavni osnovni slučaj za koji imamo rješenje i povratnu vrijednost.
- Način da se naš problem približi osnovnom slučaju. tj. način da se odreže dio problema kako bi se dobio nešto jednostavniji problem.
- Rekurzivni poziv koji jednostavniji problem vraća u metodu.
prednosti
Glavno rekurzivnim metodama je da one mogu bitikoristi se za stvaranje jasnijih i jednostavnijih verzija nekoliko algoritama nego što to mogu njihovi iterativni rođaci. Na primjer, algoritam sortiranja QuickSort prilično je teško implementirati na iterativni način.
Nedostaci
Rekurzivne verzije mnogih rutina mogu izvršiti amalo sporije od iterativnog ekvivalenta zbog dodate prekomjerne cijene poziva dodatne funkcije. Mnogi rekurzivni pozivi na metodu mogu uzrokovati prekoračenje snopa. Zbog skladištenja parametara i lokalnih varijabli, moguće je da je hrpa iscrpljena. Ako se to dogodi, sustav za pokretanje Java će uzrokovati iznimku. Međutim, vjerovatno se nećete morati brinuti zbog toga ako rekurzivna rutina ne zaživi.
Na primjer:
int myFactorial(int integer) { if( integer == 1) { return 1; } else { return(integer*(myFactorial(integer-1); } }
Rekurzija repa definira se kao da se događa kadarekurzivni poziv je na kraju rekurzivne upute. To nije slučaj s mojim tvorničkim rješenjem gore. Korisno je primijetiti kada algoritam koristi rep rekurziju jer se u takvom slučaju algoritam obično može prepisati da se umjesto njega upotrebljava iteracija. U stvari, prevoditelj će (ili barem trebao) pretvoriti rekurzivni program u iterativni. Na taj se način uklanja potencijalni problem prelijevanja snopa.
To nije slučaj s recidivom glave, niti kadafunkcija se naziva rekurzivno na različitim mjestima kao što je to u rješenju Kule iz Hanoja. Naravno, čak smo iu tim slučajevima mogli ukloniti rekurziju vlastitim snopom i u osnovi simulirajući kako bi rekurzija funkcionirala.
U mom primjeru faktororija iznad sastavljačamorat će pozvati rekurzivnu funkciju prije nego što napravi množenje jer mora razriješiti (povratnu) vrijednost funkcije prije nego što može dovršiti množenje. Dakle, redoslijed izvršenja bit će "glava" rekurzija, tj. Rekurzija se događa prije drugih operacija.
Da bismo to pretvorili u repnu rekurziju, moramo doćisve množenje je završeno i riješeno prije rekurzivnog poziva funkcije. Moramo forsirati redoslijed operacije tako da ne čekamo množenje prije povratka. Ako to učinimo, okvir snopa možemo osloboditi.
Prije ste vidjeli naš program Java za izračun faktorijela od cijelog broja.
Ispravan način za rad s rekurzivnom rekurzivnom faktorijom je sljedeći:
int factorial(int number) { if(number == 0) { return 1; } factorial_i(number, 1); } int factorial_i(int currentNumber, int sum) { if(currentNumber == 1) { return sum; } else { return factorial_i(currentNumber - 1, sum*currentNumber); } }
Primijetite to u povratkufactorial_i (trenutni broj - 1, zbroj * trenutni broj); oba su parametra odmah rješiva. Možemo izračunati što je svaki parametar bez čekanja da se vrati rekurzivni poziv funkcije. To nije slučaj s prethodnom verzijom faktorata. Ovo pojednostavljivanje omogućava prevoditelju da minimizira upotrebu snopa, kao što je gore objašnjeno.
Broj možete uzeti i od korisnika kao argument naredbenog retka.
Java rekurzijski program
class Factorial{ int fact(int n){ int result; if ( n ==1) return 1; result = fact (n-1) * n; return result; } } class Recursion{ public static void main (String args[]){ Factorial f =new Factorial(); System.out.println("Factorial of 3 is " + f.fact(3)); System.out.println("Factorial of 4 is " + f.fact(4)); System.out.println("Factorial of 5 is " + f.fact(5)); } }
Izlaz
Objašnjenje Java Code & Outputa
Ako niste upoznati sa rekurzivnim metodama, onda je to operacija činjenica() može izgledati malo zbunjujuće. Evo kako to radi. Kada činjenica() poziva se argumentom 1, funkcija vraća 1; u protivnom vraća proizvod od Činjenica (n-1) + n. procijeniti ovaj izraz, činjenica() zove se s n-1, Taj se postupak ponavlja sve dok n jednak je 1 i pozivi na metodu počinju se vraćati.
Da biste bolje razumjeli kako činjenica() metoda funkcionira, prijelimo kratki primjer. Kad računate faktororijum 3, prvi poziv na činjenica() izazvat će drugi poziv s argumentom 2. Ovaj poziv će izazvati činjenica() biti pozvan treći put s argumentom 2. Ovaj poziv će vratiti 1, koji će biti pozvan treći put s argumentom 1. Ovaj poziv će vratiti 1, koji se množi s 2 (vrijednost n u drugom zazivu). Ovaj se rezultat (koji je 2) vraća u izvorni priziv činjenica() i pomnožite s 3 (izvorna vrijednost od n). To daje odgovor 6. Možda će vam biti zanimljivo umetanje println () izjave u činjenica() koji će pokazati na kojoj je razini svaki poziv i koji su posredni odgovori.
Kad metoda sama sebe nazove, nove lokalne varijablei parametri su dodijeljeni za pohranu na hrpi, a kod metode se s ovim novim varijablama izvršava od samog početka. Rekurzivni poziv ne čini novu kopiju metode. Samo su argumenti novi. Kako se svaki rekurzivni poziv vraća, stare lokalne varijable i parametri uklanjaju se iz snopa, a izvršavanje se nastavlja na mjestu poziva unutar metode.
Dalje ćemo naučiti kako se nositi Nizanje u Javi.
Ovdje potražite korisnije vodiče i konačne smjernice o Java programiranju.
komentari