Fungsi Rekursif Python: Cara Menggunakan dan Contoh

pas kuliah dulu saya sempat mentok ngerjain soal faktorial, bukan karena rumusnya sulit, tapi karena fungsi yang saya tulis tidak mau berhenti memanggil dirinya sendiri sampai laptop kipasnya bunyi kenceng 🙂 belakangan saya paham, yang saya lewatkan cuma satu konsep kecil bernama base case. dari situ saya mulai kebanggaan sama yang namanya fungsi rekursif python.
di artikel ini saya tunjukkan cara kerja rekursi pakai bahasa sehari-hari, lengkap dengan contoh yang bisa langsung dicoba: faktorial, Fibonacci, FPB, sampai traversal folder. saya kasih juga penanganan RecursionError yang paling sering bikin pemula menyerah.
Apa Itu Fungsi Rekursif?
fungsi rekursif adalah fungsi yang memanggil dirinya sendiri di dalam tubuhnya sendiri. konsepnya mirip cermin yang saling berhadapan, cuma versi programmernya punya aturan main supaya tidak refleksi terus selamanya.
aturan mainnya ada dua, dan keduanya wajib ada:
- base case, kondisi berhenti yang mengembalikan nilai tanpa memanggil fungsi lagi
- recursive case, bagian yang memanggil fungsinya sendiri dengan masalah yang makin kecil
kalau base case-nya lupa ditulis atau tidak pernah tercapai, Python lempar RecursionError karena panggilannya menumpuk di call stack sampai melebihi batas.
Analogi Sederhana: Menara Boks
bayangkan kalian diminta hitung ada berapa boks dalam tumpukan. caranya: ambil satu boks paling atas (hitung 1), lalu minta teman hitung sisanya. teman kalian lakukan hal yang sama, ambil satu, tanya teman lain. begitu tumpukan habis, orang terakhir bilang “0”, lalu jawaban dibalikkan ke atas: 0 + 1 + 1 + 1…
- ambil satu boks dan tanya lagi = recursive case
- tumpukan habis = base case
setiap panggilan fungsi di Python bekerja persis seperti itu, tersusun di call stack, dan jawaban dihitung mundur dari panggilan terdalam.
Contoh 1: Faktorial
faktorial adalah contoh klasiknya. 5! = 5 x 4 x 3 x 2 x 1 = 120:
def faktorial(n):
if n <= 1: # base case
return 1
return n * faktorial(n - 1) # recursive case
print(faktorial(5)) # Output: 120
cara bacanya: faktorial(5) menunggu hasil faktorial(4), yang menunggu faktorial(3), dan seterusnya sampai faktorial(1) mengembalikan 1. setelah itu penghitungan naik lagi: 2*1, 3*2, 4*6, 5*24 = 120.
Contoh 2: Fibonacci
deret Fibonacci punya aturan: dua bilangan pertama adalah 0 dan 1, bilangan berikutnya adalah jumlah dua sebelumnya:
def fibonacci(n):
if n <= 1: # base case
return n
return fibonacci(n - 1) + fibonacci(n - 2)
for i in range(10):
print(fibonacci(i), end=" ")
# Output: 0 1 1 2 3 5 8 13 21 34
rekursi ini memang elegan, tapi ada biayanya. fibonacci(30) sudah ribuan panggilan berulang, dan fibonacci(50) tanpa bantuan bisa bikin laptop duduk diam lama. solusinya ada di bagian memoization di bawah.
Contoh 3: FPB (Faktor Persekutuan Terbesar)
FPB pakai algoritma Euclid, dan ini contoh rekursi yang benar-benar efisien karena jumlah panggilannya sangat sedikit:
def fpb(x, y):
if y == 0: # base case
return x
return fpb(y, x % y)
print(fpb(12, 18)) # Output: 6
fpb(12, 18) jadi fpb(18, 12), lalu fpb(12, 6), fpb(6, 0), selesai. tiga langkah saja untuk bilangan sekalipun besar.
Contoh 4: Traversal Folder
ini contoh rekursi yang paling kepakai di pekerjaan nyata: menyapu seluruh isi folder beserta subfoldernya. struktur folder itu tree, dan tree itu memang alam rekursi:
import os
def cari_file(folder, ekstensi):
hasil = []
for item in os.listdir(folder):
path = os.path.join(folder, item)
if os.path.isdir(path):
hasil.extend(cari_file(path, ekstensi)) # recursive case
elif item.endswith(ekstensi):
hasil.append(path) # base case: file cocok
return hasil
for file in cari_file("D:/project", ".py"):
print(file)
bayangkan menulis logika ini pakai loop biasa. kalian harus ngatur antrian folder manual, panjang, dan rawan bug. rekursi menyelesaikannya dalam sepuluh baris.
Rekursi vs Loop: Kapan Pakai yang Mana?
| Aspek | Rekursi | Loop |
|---|---|---|
| Keterbacaan | Elegan untuk struktur bertingkat (tree, folder) | Jelas untuk urutan linear |
| Memori | Boros, tiap panggilan numpuk di call stack | Hemat, cuma 1 frame |
| Kecepatan | Lebih lambat (overhead panggilan fungsi) | Lebih cepat |
| Risiko | RecursionError kalau terlalu dalam | Infinite loop kalau kondisi salah |
aturan praktis dari pengalaman saya: kalau masalahnya linear (menjumlahkan list, hitung rata-rata), pakai loop. kalau masalahnya bercabang (folder, tree, JSON bersarang), rekursi hampir selalu menang dari sisi kerapian.
Mengatasi RecursionError
dua penyebab paling umum dan solusinya:
1. base case tidak pernah tercapai. contohnya faktorial(n) tanpa cek n <= 1, atau parameter yang tidak mengecil. cek dulu apakah tiap panggilan membawa masalah yang lebih kecil.
2. kedalaman melebihi batas. default Python membatasi 1000 panggilan. untuk kasus yang butuh lebih, naikkan batasnya:
import sys
print(sys.getrecursionlimit()) # Output: 1000
sys.setrecursionlimit(3000) # hati-hati, terlalu besar bisa crash interpreter
jangan jadikan ini kebiasaan. kalau butuh kedalaman ribuan, biasanya masalahnya sebaiknya ditulis ulang pakai loop.
Mempercepat Rekursi dengan Memoization
kembali ke masalah Fibonacci yang lambat. @lru_cache menyimpan hasil setiap panggilan, jadi fibonacci(48) tidak dihitung ulang ribuan kali:
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(50)) # Output: 12586269025, seketika
satu dekorator, dan performanya lompat drastis. teknik ini namanya memoization, dan jadi jawaban standar kalau ditanya cara bikin rekursi Python lebih cepat.
Kesimpulan
- fungsi rekursif adalah fungsi yang memanggil dirinya sendiri, dengan syarat wajib punya base case dan recursive case
- contoh kepakaiannya: faktorial, Fibonacci, FPB, dan traversal folder
RecursionErrormuncul karena base case tidak tercapai atau kedalaman melebihi 1000; solusinya rapikan base case atau sesuaikansys.setrecursionlimit()- pakai
@lru_cacheuntuk mempercepat rekursi yang banyak hitung ulang - rekursi untuk struktur bercabang, loop untuk masalah linear
setelah paham rekursi di Python, coba bandingkan dengan implementasinya di bahasa lain biar kelihatan beda perilaku call stack-nya. prosesnya mirip, tapi rasanya beda.
Baca Juga Mengenai :
Pertanyaan yang Sering Diajukan
Apa itu fungsi rekursif Python?
Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri di dalam tubuhnya sampai kondisi berhenti (base case) terpenuhi. Dipakai untuk masalah yang strukturnya berulang seperti faktorial, Fibonacci, dan traversal folder.
Kenapa muncul RecursionError: maximum recursion depth exceeded?
Error itu muncul karena rekursi tidak pernah berhenti atau kedalaman panggilan melebihi batas default Python yaitu 1000. Pastikan base case terpenuhi, atau naikkan batas dengan sys.setrecursionlimit() kalau memang butuh kedalaman besar.
Mana yang lebih baik, rekursi atau loop?
Rekursi lebih enak dibaca untuk masalah bertingkat seperti tree dan folder, sedangkan loop lebih hemat memori untuk perhitungan sederhana. Kalau masalahnya linear seperti menjumlahkan list, pakai loop saja.
Bagaimana cara mempercepat rekursi Fibonacci?
Pakai memoization dengan @lru_cache dari functools. Hasil perhitungan di-cache, jadi fibonacci(50) yang tadinya jutaan panggilan tinggal puluhan.

