kako Reverse niz u Java koristeći rekurziju
⚡ Pametni sažetak
Revgreškom u nizu Java Rekurzija funkcionira tako da se odvoji prvi znak, preokrene preostali znak i taj prvi znak se doda na kraj. Prazan niz znakova zaustavlja pozive i odmotava stog.
U ovom primjeru programa obrnut ćemo niz koji je unio korisnik.
Napravit ćemo funkciju za okretanje niza. Later Rekurzivno ćemo ga pozivati sve dok se svi znakovi ne obrnu. Rekurzija odgovara ovom problemu jer je obrnuti niz jednostavno obrnuti rep niza s izvornim prvim znakom zaglavljenim na kraju, što je isti problem, samo jedan znak manji.
Napiši a Java Programirajte za Reverse Niz
Klasa u nastavku deklarira ulaz u main(), predaje ga reverseString() i ispisuje ono što se vrati. Dva poziva println() unutar metode čine svaki rekurzivni korak vidljivim u konzoli.
package com.guru99; public class ReverseString { public static void main(String[] args) { String myStr = "Guru99"; //create Method and pass and input parameter string String reversed = reverseString(myStr); System.out.println("The reversed string is: " + reversed); } //Method take string parameter and check string is empty or not public static String reverseString(String myStr) { if (myStr.isEmpty()){ System.out.println("String in now Empty"); return myStr; } //Calling Function Recursively System.out.println("String to be passed in Recursive Function: "+myStr.substring(1)); return reverseString(myStr.substring(1)) + myStr.charAt(0); } }
Code Izlaz:
Svaki redak izlaza je jedan rekurzivni poziv. Rep ispisan u svakom retku je jedan znak kraći od retka iznad njega, a posljednji redak prikazuje obrnuti rezultat.
String to be passed in Recursive Function: uru99 String to be passed in Recursive Function: ru99 String to be passed in Recursive Function: u99 String to be passed in Recursive Function: 99 String to be passed in Recursive Function: 9 String to be passed in Recursive Function: String in now Empty The reversed string is: 99uruG
Kako rekurzivno Reversal radi korak po korak
Dva retka nose cijelu metodu. Osnovni slučaj, if (myStr.isEmpty()), daje rekurziji mjesto gdje se treba zaustaviti. Rekurzivni redak, return reverseString(myStr.substring(1)) + myStr.charAt(0), dijeli rad na dva dijela: substring(1) je sve nakon prvog znaka, a charAt(0) je taj prvi znak, dodan nakon obrnuti ostatak.
Tracunos Guru99 jasno objašnjava redoslijed. Java gura jedan okvir za svaki poziv prije nego što se dogodi bilo kakvo spajanje:
| poziv | myStr | Preneseno na sljedeći poziv | Izraz čeka završetak |
|---|---|---|---|
| 1 | Guru99 | uru99 | obrnutiString(“uru99”) + G |
| 2 | uru99 | ru99 | obrnutiString(“ru99”) + u |
| 3 | ru99 | u99 | obrnutiString("u99") + r |
| 4 | u99 | 99 | obrnutiString("99") + u |
| 5 | 99 | 9 | obrnutiString("9") + 9 |
| 6 | 9 | (prazan) | obrnutiString("") + 9 |
| 7 | (prazan) | postignut osnovni slučaj | vraća prazan niz |
Stog se zatim odmotava od dna prema vrhu, a svaki okvir dodaje svoj spremljeni znak: prazan niz postaje 9, zatim 99, zatim 99u, 99ur, 99uru i konačno. 99uruG, Jer Java Nizovi znakova su nepromjenjivi, nijedna od ovih međuvrijednosti ne prepisuje prethodnu - svako spajanje dodjeljuje novi objekt String.
Dva detalja u izlazu konzole vrijedna su spomena. Šesti redak završava bez ičega nakon dvotočke, jer substring(1) na nizu od jednog znaka vraća prazan niz umjesto null. Poruka koja slijedi glasi „String in now Empty“ u izvornom programu; formulacija je tipografska pogreška za „String is now empty“ i ostavljena je netaknuta tako da se kod i gornji izlaz i dalje podudaraju redak po redak.
Drugi načini za Reverse niz u Java
Rekurzija je najjasniji način za vidjeti Do preokreta može doći, ali to je rijetko način na koji to radi produkcijski kod. Tri alternative pokrivaju gotovo svaki stvarni slučaj.
1. StringBuilder.reverse() je najkraći i najbrži. Klasa ima ugrađenu metodu reverse(), tako da cijeli posao stane u jedan redak:
String reversed = new StringBuilder(myStr).reverse().toString();
2. Petlja for s funkcijom charAt() pregledava niz unatrag od zadnjeg indeksa do nule. Anketari često traže ovu verziju jer prikazuje logiku umjesto da je delegira:
String reversed = ""; for (int i = myStr.length() - 1; i >= 0; i--) { reversed = reversed + myStr.charAt(i); }
3. Dvopokazna zamjena preko funkcije toCharArray() pretvara niz znakova u niz znakova, a zatim mijenja najudaljenije znakove prema unutra dok se pokazivači ne sretnu u sredini:
char[] chars = myStr.toCharArray(); int left = 0; int right = chars.length - 1; while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } String reversed = new String(chars);
Ista tehnika niza obrće numerički niz ili bilo koju drugu uređenu kolekciju, zbog čega se pojavljuje u Java poredak vježbe jednako često kao i kod žica.
Vremenska i prostorna složenost svakog pristupa
Četiri verzije ne koštaju isto. Oba kvadratna unosa u nastavku dijele jedan razlog: stvaraju potpuno novi niz znakova u svakom koraku, a kopiranje n znakova n puta je n kvadratnih radova.
| Pristup | Vrijeme | Dodatni prostor | Zašto |
|---|---|---|---|
| Rekurzija s podnizom() | O(n²) | O(n²) | substring() kopira preostale znakove pri svakom pozivu, a po znaku se zadržava jedan okvir stoga. |
| for petlja s charAt() i + | O(n²) | O(n²) | Svako spajanje dodjeljuje novi niz znakova i kopira sve što je do sada prikupljeno. |
| StringBuilder.reverse() | O (n) | O (n) | Jedan promjenjivi međuspremnik, jedan prolaz i surogatni parovi ostaju netaknuti |
| Dva pokazivača na toCharArray() | O (n) | O (n) | Jedna kopija polja, zatim n/2 zamjene bez daljnje alokacije |
Odaberite rekurzivnu verziju za učenje ili demonstraciju ponašanja pozivnog stoga, verziju s nizom znakova kada ispitivač ručno traži logiku i StringBuilder.reverse() u bilo čemu što se isporučuje. Isti kompromis između rješenja za podučavanje i produkcijskog rješenja pojavljuje se u klasičnim vježbama, od sortiranje mjehurićima i Fibonaccijevi niz do provjere prostih brojeva; svaki od njih vrijedi vježbati Java u oba smjera.
