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.
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:
| Memanggil | myStr | Diteruskan ke panggilan berikutnya | Ekspresi menunggu untuk selesai |
|---|---|---|---|
| 1 | Guru99 | uru99 | reverseString(“uru99”) + G |
| 2 | uru99 | ru99 | reverseString(“ru99”) + u |
| 3 | ru99 | u99 | reverseString(“u99”) + r |
| 4 | u99 | 99 | reverseString(“99”) + u |
| 5 | 99 | 9 | reverseString(“9”) + 9 |
| 6 | 9 | (kosong) | reverseString(“”) + 9 |
| 7 | (kosong) | kasus dasar tercapai | mengembalikan 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.
| Pendekatan | Waktu | Ruang ekstra | Mengapa |
|---|---|---|---|
| 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.
