Panduan ini menjelaskan metode rekursif Java, melalui contoh klasik faktorial, dan mengevaluasi kelebihan serta kekurangan penggunaan rekursi.
Di Java, sebuah metode yang memanggil dirinya sendiri disebut metode rekursif, dan teknik secara keseluruhan dikenal sebagai rekursi. Ilustrasi sederhana dari kehidupan nyata adalah dua cermin yang menghadap satu sama lain: setiap refleksi adalah citra cermin lainnya, berulang hingga cahaya diserap.
Bagaimana Rekursi Bekerja
Pada ilustrasi di atas, metode recurse() dipanggil dari main()—pemanggilan normal. Di dalam recurse(), metode yang sama memanggil dirinya sendiri lagi, menciptakan pemanggilan rekursif. Untuk mencegah looping tak hingga, setiap pemanggilan rekursif harus mencakup kondisi terminasi, biasanya diimplementasikan dengan pernyataan if…else.
Contoh: Faktorial dari Sebuah Angka Menggunakan Rekursi
class Factorial { static int factorial(int n) { if (n != 0) // kondisi terminasi return n * factorial(n - 1); // pemanggilan rekursif else return 1; } public static void main(String[] args) { int number = 4, result; result = factorial(number); System.out.println(number + " factorial = " + result); } }
Output:
4 factorial = 24
Metode factorial() dipanggil dari main() dengan argumen number. Di dalam factorial(), baris
return n * factorial(n-1);
menyebabkan metode memanggil dirinya sendiri dengan nilai yang diturunkan. Memulai dengan n = 4, pemanggilan berlanjut: 4 → 3 → 2 → 1 → 0. Saat n mencapai 0, kondisi if gagal, mengembalikan 1. Hasil perkalian yang terkumpul kemudian menyebar kembali ke atas tumpukan pemanggilan ke main().
Bagaimana Program Faktorial Dieksekusi
Gambar di bawah ini menggambarkan evolusi tumpukan pemanggilan selama eksekusi.
Kelebihan dan Kekurangan Rekursi
Pro: Menyederhanakan kode untuk masalah yang secara alami cocok dengan pola rekursif (misalnya, traversal pohon, generasi kombinatorial). Sering menghasilkan implementasi yang lebih pendek dan lebih mudah dibaca.
Kontra: Setiap pemanggilan rekursif mengonsumsi ruang tumpukan; rekursi yang dalam dapat menyebabkan stack overflow. Solusi rekursif biasanya lebih kurang efisien dalam memori dan mungkin berjalan lebih lambat daripada counterparts iteratif.
Secara keseluruhan, rekursi menawarkan solusi yang elegan dengan biaya penggunaan memori yang lebih tinggi dan potensi overhead performa. Untuk banyak kasus penggunaan, terutama yang memiliki kedalaman terbatas, trade-off tersebut berkesan.