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.

  • 🔘 Osnovni slučaj: Metoda se vraća odmah kada isEmpty() javi da nema ništa preostalo za poništavanje.
  • ☑️ Rekurzivni korak: substring(1) uklanja prvi znak, a charAt(0) ga vraća nakon obrnutog ostatka.
  • Nepromjenljivost: Svaki poziv proizvodi novi String objekt, jer Java Niz se nikada ne može uređivati ​​na mjestu.
  • 🧪 Trace: Guru99 postaje 99uruG nakon sedam poziva, po jedan za svaki znak plus prazan osnovni slučaj.
  • 🛠️ Brže opcije: StringBuilder.reverse() i dvopokazna zamjena na toCharArray() završavaju u jednom prolazu.
  • 📌 Trošak: Rekurzija sa substring() izvodi se u kvadratnom vremenu i zadržava jedan okvir stoga po znaku.

Java program koji rekurzivnom metodom obrće niz znakova

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:

pozivmyStrPreneseno na sljedeći pozivIzraz čeka završetak
1Guru99uru99obrnutiString(“uru99”) + G
2uru99ru99obrnutiString(“ru99”) + u
3ru99u99obrnutiString("u99") + r
4u9999obrnutiString("99") + u
5999obrnutiString("9") + 9
69(prazan)obrnutiString("") + 9
7(prazan)postignut osnovni slučajvrać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.

PristupVrijemeDodatni prostorZaš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.

Pitanja i odgovori

Objekti tipa String su nepromjenjivi, tako da se znakovi unutar jednog nikada ne mogu promijeniti nakon stvaranja. Svako poništavanje stoga gradi novi objekt. Koristite StringBuilder ili niz znakova kada se znakovi moraju mijenjati bez dodjeljivanja novog Stringa u svakom koraku.

Prvi poziv metode isEmpty() izbacuje NullPointerException, jer se metoda poziva ni na što. Zaštitite ulaznu točku provjerom null vrijednosti koja vraća null ili izbacuje IllegalArgumentException prije početka bilo kakve rekurzije.

Nije pouzdano. charAt() radi na 16-bitnim kodnim jedinicama, pa se znak pohranjen kao surogatni par dijeli, a obrnuti tekst prikazuje zamjenske kvadrate. StringBuilder.reverse() drži surogatne parove zajedno, što ga čini sigurnijim izborom za Unicode tekst.

StringBuilder, u gotovo svakom slučaju. Oba izlažu istu metodu reverse(), ali StringBuffer sinkronizira svaki poziv, što košta brzinu. Odaberite nizBuffer samo kada je jedan međuspremnik zaista podijeljen između niti.

Podijelite rečenicu na razmacima pomoću split(” “), a zatim prođite kroz rezultirajući niz od zadnjeg indeksa do prvog, dodajući svaku riječ u StringBuilder. Znakovi unutar svake riječi ostaju u izvornom redoslijedu.

Po znaku se koristi jedan okvir stoga, tako da je tipično nekoliko tisuća znakova prije nego što se pojavi StackOverflowError. Točno ograničenje ovisi o veličini stoga JVM niti. Bilo koja iterativna verzija u potpunosti izbjegava plafon.

AI asistent može pročitati stog trace., ukažite na nedostajući ili nedostižni osnovni slučaj i objasnite redoslijed kojim se okviri odmotavaju. Također izrađuje testove rubnih slučajeva za prazne, jednoznakovne i null ulaze. Provjerite obrazloženje u stvarnom izvršavanju.

Da. Ko-pilot obično dovršava cijelu obrnutu metodu samo iz potpisa, često prvo nudeći StringBuilder oblik. Provjerite osnovni slučaj i složenost, jer najkraći prijedlog nije uvijek verzija koju vježba traži.

Sažmite ovu objavu uz: