Faktorial dari 5 ditulis 5! = 5 × 4 × 3 × 2 × 1, dan definisinya memang berulang pada ukuran yang lebih kecil: 5! = 5 × 4!. Masalah yang definisinya merujuk dirinya sendiri paling natural diselesaikan oleh method yang memanggil dirinya sendiri. Method dengan perilaku seperti itu disebut recursive method (method rekursif).
Dua Syarat Rekursi #
Setiap recursive method wajib memiliki dua bagian:
- Base case: kondisi yang menghentikan panggilan berikutnya dan mengembalikan nilai langsung tanpa memanggil diri sendiri.
- Recursive case: cabang yang memanggil method itu sendiri dengan masukan yang mendekati base case pada setiap langkah.
Tanpa base case, panggilan akan menumpuk terus dan program berhenti dengan galat.
Contoh Lengkap #
static class Rekursi
{
public static int HitungFaktorial(int n)
{
if (n <= 1)
{
return 1;
}
return n * HitungFaktorial(n - 1);
}
public static void HitungMundur(int n)
{
if (n < 1)
{
return;
}
Console.WriteLine($"Detik {n}");
HitungMundur(n - 1);
}
}
int hasil = Rekursi.HitungFaktorial(5);
Console.WriteLine($"5! = {hasil}");
Rekursi.HitungMundur(3);Output yang Dihasilkan:
5! = 120
Detik 3
Detik 2
Detik 1Mari kita telusuri alur HitungFaktorial(5):
- Baris 5-8 (base case): selama
nmasih di atas1, kondisi ini dilewati; kondisi baru terpenuhi ketikanmencapai1, yang langsung mengembalikan1tanpa panggilan baru. - Baris 9 (recursive case):
HitungFaktorial(5)menunggu hasilHitungFaktorial(4), yang menungguHitungFaktorial(3), dan seterusnya hinggaHitungFaktorial(1). - Setelah base case mengembalikan
1, hasil dikembalikan berlapis:1 × 2 = 2, lalu2 × 3 = 6,6 × 4 = 24, dan24 × 5 = 120. - Baris 12-20 (
HitungMundur): rekursi bertipevoid; base case memakaireturn;tanpa nilai untuk berhenti, dan setiap tingkat mencetak pesannya sebelum memanggil diri dengann - 1.
Setiap panggilan menyimpan satu frame di call stack — memori untuk melacak titik kembali. Frame bertumpuk selama rekursi berjalan dan terkuras satu per satu saat hasil mulai dikembalikan.
Cara membaca rekursi yang paling ringkas: percayai bahwa panggilan untuk ukuran lebih kecil mengembalikan hasil yang benar, lalu pastikan langkah saat ini benar. Untuk HitungFaktorial, keyakinannya berbunyi: HitungFaktorial(n - 1) mengembalikan (n-1)!, sehingga n * HitungFaktorial(n - 1) menjadi n!. Melacak seluruh panggilan di kepala justru membuat rekursi terasa sulit.
Banyak persoalan berulang sebenarnya lebih ringan diselesaikan dengan loop. Rekursi paling bermanfaat ketika struktur masalahnya memang berlapis, misalnya menelusuri struktur bertingkat.