Pernah Melihat Cermin yang Saling Berhadapan?
Jika dua cermin diletakkan saling berhadapan, bayangan akan tampak muncul berulang kali hingga terlihat tidak ada akhirnya.
Konsep tersebut mirip dengan rekursi (recursion) dalam pemrograman.
Sebuah prosedur atau fungsi dapat memanggil dirinya sendiri untuk menyelesaikan sebuah pekerjaan. Namun, agar proses tersebut tidak berlangsung tanpa akhir, harus ada kondisi penghentian (base case).
Apa Itu Rekursi?
Rekursi adalah teknik pemrograman di mana sebuah Sub atau Function memanggil dirinya sendiri sampai kondisi tertentu terpenuhi.
Secara sederhana, alur kerjanya seperti ini.
Mulai
↓
Panggil Procedure
↓
Apakah kondisi berhenti terpenuhi?
├── Ya → Selesai
│
└── Tidak
↓
Panggil Procedure Lagi
Setiap pemanggilan akan membuat VBA menjalankan prosedur yang sama dengan kondisi yang berbeda.
Mengapa Menggunakan Rekursi?
Tidak semua masalah cocok diselesaikan dengan rekursi. Namun, teknik ini sangat membantu untuk kasus-kasus yang memiliki pola berulang.
Contohnya:
-
Menghitung faktorial.
-
Menghasilkan deret bilangan.
-
Menelusuri folder dan subfolder.
-
Menelusuri struktur menu.
-
Memproses struktur data bertingkat.
Komponen Penting Rekursi
Sebuah prosedur rekursif selalu memiliki dua bagian utama.
1. Base Case (Kondisi Berhenti)
Kondisi yang menentukan kapan proses rekursi harus dihentikan.
Tanpa kondisi ini, prosedur akan terus memanggil dirinya sendiri hingga menyebabkan Stack Overflow.
2. Recursive Call
Bagian yang memanggil prosedur atau fungsi itu sendiri.
Biasanya disertai perubahan nilai parameter agar perlahan mendekati kondisi berhenti.
Contoh Sederhana
Misalkan kita ingin menghitung mundur dari angka 5.
Sub HitungMundur(ByVal Angka As Integer)
If Angka = 0 Then Exit Sub
MsgBox Angka
HitungMundur Angka - 1
End Sub
Pemanggilan:
Sub Mulai()
HitungMundur 5
End Sub
Hasil yang muncul:
5
4
3
2
1
Bagaimana Rekursi Bekerja?
Saat menjalankan:
HitungMundur 3
VBA melakukan proses berikut.
HitungMundur(3)
↓
HitungMundur(2)
↓
HitungMundur(1)
↓
HitungMundur(0)
↓
Selesai
Setiap pemanggilan menunggu proses berikutnya selesai sebelum akhirnya seluruh proses berakhir.
Contoh Menghitung Faktorial
Rumus faktorial:
5! = 5 × 4 × 3 × 2 × 1
Implementasi pada VBA:
Function Faktorial(ByVal N As Integer) As Long
If N <= 1 Then
Faktorial = 1
Else
Faktorial = N * Faktorial(N - 1)
End If
End Function
Pemanggilan:
Sub Tes()
MsgBox Faktorial(5)
End Sub
Output:
120
Visualisasi Perhitungan Faktorial
Saat memanggil:
Faktorial(4)
VBA akan memprosesnya seperti berikut.
4 × Faktorial(3)
↓
3 × Faktorial(2)
↓
2 × Faktorial(1)
↓
1
↓
2
↓
6
↓
24
Hasil akhirnya adalah 24.
Rekursi vs Perulangan
Masalah yang sama sering kali dapat diselesaikan menggunakan rekursi maupun perulangan.
| Rekursi | Perulangan |
|---|---|
| Memanggil dirinya sendiri | Menggunakan For, Do, atau While |
| Kode lebih ringkas pada kasus tertentu | Umumnya lebih mudah dipahami |
| Membutuhkan memori lebih besar | Lebih hemat memori |
| Harus memiliki base case | Tidak membutuhkan base case |
Studi Kasus
Menampilkan Angka 1 sampai 5
Menggunakan rekursi.
Sub Tampilkan(ByVal N As Integer)
If N > 5 Then Exit Sub
MsgBox N
Tampilkan N + 1
End Sub
Pemanggilan:
Sub Mulai()
Tampilkan 1
End Sub
Kapan Rekursi Sebaiknya Digunakan?
Rekursi cocok digunakan ketika:
-
Masalah memiliki pola yang berulang.
-
Setiap langkah dapat dipecah menjadi masalah yang lebih kecil.
-
Solusi rekursif lebih mudah dipahami daripada perulangan.
Sebaliknya, untuk proses sederhana seperti menghitung jumlah baris atau mengisi data ke worksheet, perulangan (For...Next atau Do...Loop) biasanya lebih efisien.
Tips Menggunakan Rekursi
✅ Selalu buat kondisi berhenti (base case).
✅ Pastikan setiap pemanggilan mendekati kondisi berhenti.
✅ Gunakan rekursi untuk masalah yang memang sesuai.
✅ Uji dengan data kecil terlebih dahulu sebelum menggunakan data yang lebih besar.
Kesalahan yang Sering Terjadi
1. Tidak Membuat Base Case
Sub Tes()
Tes
End Sub
Kode tersebut akan terus memanggil dirinya sendiri tanpa henti hingga menyebabkan Stack Overflow.
2. Nilai Parameter Tidak Berubah
Sub Tes(ByVal N As Integer)
Tes N
End Sub
Karena nilai N tidak berubah, kondisi berhenti tidak akan pernah tercapai.
3. Menggunakan Rekursi untuk Masalah Sederhana
Tidak semua proses membutuhkan rekursi. Untuk tugas yang dapat diselesaikan dengan perulangan sederhana, penggunaan For...Next atau Do...Loop sering kali lebih efisien.
Ringkasan
| Konsep | Penjelasan |
|---|---|
| Rekursi | Prosedur atau fungsi memanggil dirinya sendiri. |
| Base Case | Kondisi yang menghentikan rekursi. |
| Recursive Call | Pemanggilan ulang terhadap prosedur atau fungsi yang sama. |
| Kelebihan | Cocok untuk masalah yang memiliki pola berulang. |
| Kekurangan | Menggunakan lebih banyak memori dan berisiko Stack Overflow jika tidak dirancang dengan benar. |
Kesimpulan
Rekursi merupakan teknik pemrograman yang memungkinkan sebuah prosedur atau fungsi memanggil dirinya sendiri untuk menyelesaikan masalah secara bertahap. Agar rekursi berjalan dengan benar, setiap pemanggilan harus mendekati kondisi berhenti (base case). Tanpa kondisi tersebut, program dapat mengalami Stack Overflow karena proses pemanggilan tidak pernah berakhir.
Meskipun tidak selalu menjadi pilihan terbaik dibandingkan perulangan, rekursi sangat berguna untuk menyelesaikan masalah yang memiliki struktur berulang atau bertingkat dengan kode yang lebih ringkas dan mudah dipahami.
Latihan Mandiri
Latihan 1
Buat sebuah fungsi rekursif untuk menghitung jumlah bilangan dari 1 sampai N. Misalnya, jika N = 5, maka hasilnya adalah 15.
Latihan 2
Buat prosedur rekursif yang menampilkan angka dari 10 hingga 1 menggunakan MsgBox.
Latihan 3
Ubah program faktorial rekursif menjadi program menggunakan perulangan For...Next, kemudian bandingkan jumlah baris kode dan kemudahan pemahamannya.
