How to Reverse sebuah String di Java menggunakan Rekursi

⚡ Ringkasan Cerdas

Revmenyilangkan tali di Java Dengan rekursi, cara kerjanya adalah dengan mengupas karakter pertama, membalikkan apa pun yang tersisa, dan menambahkan karakter pertama tersebut ke akhir. String kosong menghentikan panggilan dan mengembalikan tumpukan ke keadaan semula.

  • 🔘 Kasus dasar: Metode ini akan segera kembali ketika isEmpty() melaporkan bahwa tidak ada lagi yang perlu dibalik.
  • ☑️ Langkah rekursif: substring(1) menghapus karakter pertama dan charAt(0) mengembalikannya setelah sisa yang dibalik.
  • Kekekalan: Setiap panggilan menghasilkan objek String baru, karena Java String tidak dapat diedit langsung di tempatnya.
  • 🧪 Trace: Guru99 menjadi 99uruG setelah tujuh kali panggilan, satu untuk setiap karakter ditambah kasus dasar kosong.
  • Opsi yang lebih cepat: StringBuilder.reverse() dan pertukaran dua pointer melalui toCharArray() keduanya selesai dalam satu kali proses.
  • 📌 Biaya: Rekursi dengan substring() berjalan dalam waktu kuadratik dan menyimpan satu frame tumpukan per karakter.

Java Program yang membalikkan string menggunakan metode rekursif.

Dalam contoh program ini, kami akan membalikkan string yang dimasukkan oleh pengguna.

Kami akan membuat fungsi untuk membalikkan string. Later Kita akan memanggilnya secara rekursif sampai semua karakter dibalik. Rekursi cocok untuk masalah ini karena string yang dibalik hanyalah bagian akhir string yang dibalik dengan karakter pertama asli yang ditempelkan di ujungnya, yang merupakan masalah yang sama dengan satu karakter lebih kecil.

Menulis untuk Java Program untuk Reverse String

Kelas di bawah ini mendeklarasikan input di main(), menyerahkannya ke reverseString(), dan mencetak apa yang dikembalikan. Dua panggilan println() di dalam metode membuat setiap langkah rekursif terlihat di konsol.

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 Keluaran:

Setiap baris output merupakan satu panggilan rekursif. Ekor yang tercetak di setiap baris lebih pendek satu karakter daripada baris di atasnya, dan baris terakhir menunjukkan hasil yang dibalik.

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

Bagaimana Rekursif RevPekerjaan Umum Langkah demi Langkah

Dua baris kode memuat keseluruhan metode. Kasus dasar, if (myStr.isEmpty()), memberikan titik berhenti bagi rekursi. Baris rekursif, return reverseString(myStr.substring(1)) + myStr.charAt(0), membagi pekerjaan menjadi dua: substring(1) adalah semua yang ada setelah karakter pertama, dan charAt(0) adalah karakter pertama tersebut, yang ditambahkan. setelah sisa yang dibalik.

Tracmemasukkan input GuruAngka 99 memperjelas urutannya. Java mengirimkan satu frame untuk setiap panggilan sebelum penggabungan terjadi:

MemanggilmyStrDiteruskan ke panggilan berikutnyaEkspresi menunggu untuk selesai
1Guru99uru99reverseString(“uru99”) + G
2uru99ru99reverseString(“ru99”) + u
3ru99u99reverseString(“u99”) + r
4u9999reverseString(“99”) + u
5999reverseString(“9”) + 9
69(kosong)reverseString(“”) + 9
7(kosong)kasus dasar tercapaimengembalikan string kosong

Tumpukan kemudian diuraikan dari bawah ke atas, dan setiap bingkai menambahkan karakter yang disimpannya: string kosong menjadi 9, lalu 99, lalu 99u, 99ur, 99uru, dan akhirnya 99uruG. Karena Java String bersifat immutable (tidak dapat diubah), tidak ada nilai perantara yang menimpa nilai sebelumnya — setiap penggabungan akan mengalokasikan objek String baru.

Dua detail dalam output konsol perlu disebutkan. Baris keenam diakhiri dengan kosong setelah titik dua, karena substring(1) pada string satu karakter mengembalikan string kosong, bukan null. Pesan yang mengikutinya berbunyi “String in now Empty” dalam program aslinya; kata-kata tersebut adalah kesalahan ketik untuk “String is now empty” dan dibiarkan apa adanya sehingga kode dan output di atas masih cocok baris demi baris.

Cara Lain untuk Reverse sebuah String di Java

Rekursi adalah cara paling jelas untuk melihat Pembalikan memang terjadi, tetapi jarang terjadi seperti yang dilakukan kode produksi. Tiga alternatif mencakup hampir setiap kasus nyata.

1. StringBuilder.reverse() adalah yang terpendek dan tercepat. Kelas ini memiliki metode reverse() bawaan, sehingga seluruh pekerjaan dapat diselesaikan dalam satu baris:

String reversed = new StringBuilder(myStr).reverse().toString();

2. Sebuah perulangan for dengan charAt() Melangkah mundur dalam string dari indeks terakhir ke nol. Pewawancara sering meminta versi ini karena menunjukkan logikanya alih-alih mendelegasikannya:

String reversed = "";
for (int i = myStr.length() - 1; i >= 0; i--) {
    reversed = reversed + myStr.charAt(i);
}

3. Pertukaran dua pointer melalui toCharArray() Mengubah string menjadi array karakter, kemudian menukar karakter terluar ke dalam hingga pointer bertemu di tengah:

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);

Teknik array yang sama membalikkan urutan numerik atau koleksi terurut lainnya, itulah sebabnya teknik ini muncul di Java susunan berlatih sesering mungkin seperti halnya latihan alat musik gesek.

Kompleksitas Waktu dan Ruang dari Setiap Pendekatan

Keempat versi tersebut tidak memiliki biaya yang sama. Kedua entri kuadrat di bawah ini memiliki satu penyebab yang sama: keduanya membuat String baru di setiap langkah, dan menyalin n karakter sebanyak n kali membutuhkan n kuadrat pekerjaan.

PendekatanWaktuRuang ekstraMengapa
Rekursi dengan substring()HAI(n²)HAI(n²)Fungsi substring() menyalin karakter yang tersisa pada setiap panggilan, dan satu frame tumpukan (stack frame) disimpan untuk setiap karakter.
perulangan for dengan charAt() dan +HAI(n²)HAI(n²)Setiap penggabungan mengalokasikan String baru dan menyalin semua yang telah dikumpulkan sejauh ini.
StringBuilder.reverse()O (n)O (n)Satu buffer yang dapat diubah, satu lintasan, dan pasangan pengganti tetap utuh.
Dua pointer ke toCharArray()O (n)O (n)Satu salinan array, kemudian n/2 pertukaran tanpa alokasi lebih lanjut.

Pilih versi rekursif untuk belajar atau mendemonstrasikan bagaimana perilaku tumpukan panggilan, versi array karakter ketika pewawancara meminta logika secara manual, dan StringBuilder.reverse() di semua versi yang dirilis. Kompromi yang sama antara solusi pengajaran dan solusi produksi muncul di seluruh latihan klasik, mulai dari semacam gelembung dan deret fibonacci untuk pengecekan bilangan prima; masing-masing layak untuk dipraktikkan Java kedua arah.

Pertanyaan Umum Demo Slot

Objek String bersifat immutable (tidak dapat diubah), sehingga karakter di dalamnya tidak akan pernah berubah setelah pembuatan. Oleh karena itu, setiap pembalikan akan membangun objek baru. Gunakan StringBuilder atau array char ketika karakter harus dimodifikasi tanpa mengalokasikan String baru di setiap langkah.

Panggilan pertama ke isEmpty() akan melempar NullPointerException, karena metode tersebut dipanggil pada sesuatu yang kosong. Lindungi titik masuk dengan pemeriksaan null yang mengembalikan null atau melempar IllegalArgumentException sebelum rekursi dimulai.

Tidak dapat diandalkan. charAt() bekerja pada unit kode 16-bit, sehingga karakter yang disimpan sebagai pasangan pengganti akan dipisahkan dan teks yang dibalik akan menampilkan kotak pengganti. StringBuilder.reverse() menjaga pasangan pengganti tetap bersama, yang menjadikannya pilihan yang lebih aman untuk teks Unicode.

StringBuilder, hampir dalam setiap kasus. Keduanya memiliki metode reverse() yang sama, tetapi StringBuffer Sinkronisasi setiap panggilan, yang mengurangi kecepatan. Pilih String.Buffer hanya ketika satu buffer benar-benar digunakan bersama oleh beberapa thread.

Pisahkan kalimat berdasarkan spasi dengan split(” “), lalu telusuri array yang dihasilkan dari indeks terakhir ke indeks pertama, tambahkan setiap kata ke StringBuilder. Karakter di dalam setiap kata tetap dalam urutan aslinya.

Satu frame tumpukan digunakan per karakter, jadi beberapa ribu karakter biasanya terjadi sebelum StackOverflowError muncul. Batas pastinya bergantung pada ukuran tumpukan thread JVM. Versi iteratif apa pun sepenuhnya menghindari batasan tersebut.

Asisten AI dapat membaca tumpukan data. trace, tunjukkan kasus dasar yang hilang atau tidak dapat dijangkau, dan jelaskan urutan di mana frame diuraikan. Ini juga menyusun tes kasus batas untuk input kosong, karakter tunggal, dan null. Verifikasi penalaran tersebut terhadap eksekusi nyata.

Ya. Copilot Biasanya, metode pembalikan lengkap dapat dibuat hanya dari tanda tangan saja, seringkali menawarkan bentuk StringBuilder terlebih dahulu. Periksa kasus dasar dan kompleksitasnya, karena saran terpendek tidak selalu merupakan versi yang diminta dalam latihan.

Ringkaslah postingan ini dengan: