Pengertian Fungsi Rekursif
Di dalam dunia pemrograman, fungsi rekursif merupakan sebuah metode perulangan yang bersifat non-iterasi.
Sebenarnya fungsi rekursif hanyalah sebuah fungsi biasa seperti fungsi def pada umumnya. Dia bisa dipanggil, bisa menerima parameter, bisa mengembalikan nilai, dan lain sebagainya.
Hanya saja, sesuai namanya, fungsi rekursif itu bersifat rekursi.
Kenapa?
Karena ia memanggil dirinya sendiri sehingga menimbulkan efek perulangan. Perulangan ini bisa berhenti ketika kondisi tertentu tercapai, atau bisa juga bersifat tak terbatas, atau mungkin bahkan bisa menimbulkan error karena pemanggilan fungsi yang tak ada habisnya.
Ilustrasi Fungsi Rekursif
Hmmm..
Ilustrasinya mungkin seperti 2 cermin yang saling memantulkan satu sama lain. Seperti foto yang diunggah di twitter berikut:
Cermin-cermin tersebut saling memantulkan satu sama lain, sehingga hasil pantulan satu cermin akan dipantulkan lagi dan lagi secara terus menerus. Akhirnya hal tersebut menimbulkan efek cermin di dalam cermin di dalam cermin di dalam cermin di dalam cermin dan seterusnya.
Sampul Buku BSE yang Viral Karena Rekursif
Atau… untuk contoh dalam negeri.
Kita bisa dapati efek rekursif pada sampul buku BSE yang sempat viral.
Begini bentuk sampul yang menyebar:
Salah seorang netizen di Facebook mencoba memperbesar gambar tersebut, lalu apa yang terjadi? Ternyata salah seorang siswa di sampul tersebut memegang buku BSE yang sama yang mana di dalam sampulnya juga terdapat seorang siswa tadi yang juga memegang buku BSE yang sama yang yang yang… Oke skip π€£
Begitulah kira-kira rekursif itu.
Saya yakin, meskipun mungkin penjelasan dosen maupun guru di kelas agak belibet, tapi harusnya sampai sini kita telah sedikit mendapat pencerahan.
Membuat Fungsi Rekursif
Untuk membuat fungsi rekursif, caranya sama saja dengan fungsi biasa.
Yang membuat sebuah fungsi menjadi rekursif adalah karena ia memanggil dirinya sendiri. Itu saja.
Jadi contoh paling sederhanya bisa terlihat seperti berikut:
def halo_dunia():
print('Halo dunia!')
# panggil dirinya sendiri
halo_dunia() # <-- rekursifitas
# memanggil fungsi helo_dunia untuk pertama kali
halo_dunia()
Error yang saya dapat:
...
Halo dunia!
Halo dunia!
Halo dunia!
Fatal Python error: _Py_CheckRecursiveCall: Cannot recover
from stack overflow.
Python runtime state: initialized
Kenapa Error?
Karena perulangan rekursif sudah dipanggil terlalu banyak dan tidak ada tanda-tanda akan berhenti. Oleh karena itu sistem langsung memberhentikannya secara paksa.
Perlu diketahui kode program di atas berpotensi bisa membuat PC kita menjadi hank karena efek perulangan rekursif tak terbatas (meskipun sebenarnya interpreter python telah membatasi jumlah kedalaman rekursif sebelum PC kehilangan kendali).
Menampilkan Angka 1 Sampai 10
Untuk lebih memahami bagaimana cara fungsi rekursif bekerja, mari kita buat contoh sederhana yaitu dengan menampilkan angka 1 sampai 10.
Kalau kita membuatnya dengan perulangan for, kode programnya akan terlihat sesimpel ini:
for i in range(10):
print(i)
Nah, pertanyaannya adalah: bagaimana cara mengubah perulangan di atas menjadi perulangan rekursif?
Ikuti langkah-langkah berikut:
Step 1: Bikin dasarnya dulu
Untuk ancang-ancang dan mempermudah pemahaman, kita bikin dulu seperti ini:
def tampilkanAngka (i):
print(f'Perulangan ke {i}')
# panggil beberapa kali
tampilkanAngka(1)
tampilkanAngka(2)
tampilkanAngka(3)
Output:
Perulangan ke 1
Perulangan ke 2
Perulangan ke 3
Sampai sini sangat jelas. Fungsi tampilanAngka()
kita panggil 3 kali dengan parameter i
yang berbeda-beda.
Step 2: Tentukan batasnya
Sekarang, ubah parameter fungsi tampilkanAngka
menjadi 2 parameter:
batas
- Sebagai batas dari perulangan. Ini bersifat wajib diisi.i
- Ini sebagai penanda iterasi keberapa. Kita jadikan ini parameter ke-2 dan bersifat opsional.
def tampilkanAngka (batas, i = 1):
print(f'Perulangan ke {i}')
# Panggil beberapa kali untuk mensimulasikan
# cara kerja
tampilkanAngka(3)
tampilkanAngka(3, 2)
tampilkanAngka(3, 3)
Jika dijalankan, kita akan mendapatkan output:
Perulangan ke 1
Perulangan ke 2
Perulangan ke 3
Step 3: Rekursifitas! Panggil diri sendiri.
Nah, dari kode program terakhir, kita jadi tahu bagaimana harusnya fungsi tampilanAngka()
dipanggil.
Jika kita ingin menampilkan 10x perulangan, itu artinya:
- Parameter
batas
akan selalu bernilai 10 - Sedangkan parameter
i
akan bernilai 1 sampai dengan 10. - Lalu ketika variabel
i
sudah sama dengan nilai variabelbatas
, maka perulangan dihentikan alias rekursifitas tidak perlu dilakukan lagi.
Kita terapkan dalam kode program:
def tampilkanAngka (batas, i = 1):
print(f'Perulangan ke {i}')
if (i < batas):
# di sini lah rekursifitas itu terjadi
tampilkanAngka(batas, i + 1)
# memanggil fungsi tampilkanAngka
# untuk pertama kali
tampilkanAngka(10)
Output:
Perulangan ke 1
Perulangan ke 2
Perulangan ke 3
...
Perulangan ke 8
Perulangan ke 9
Perulangan ke 10
Perhatikan Alur Perjalanan Program
Oke. Sekarang kita akan bermain-main dengan alur program rekursif.
Kita akan coba balik perintah print()
dan perintah rekursif. Yang awalnya print()
terlebih dulu kemudian proses rekursif, sekarang kita ubah menjadi proses rekursif dahulu baru setelah itu proses print()
.
Perhatikan kode program di bawah:
def tampilkanAngka (batas, i = 1):
if (i < batas):
# di sini lah rekursifitas itu terjadi
tampilkanAngka(batas, i + 1)
print(f'Perulangan ke {i}')
# memanggil fungsi tampilanAngka
# untuk pertama kali
tampilkanAngka(10)
Coba jalankan, maka kita akan mendapatkan output:
Perulangan ke 10
Perulangan ke 9
Perulangan ke 8
...
Perulangan ke 3
Perulangan ke 2
Perulangan ke 1
Loh, kok jadi kebalik? π
Jadi, alurnya gini:
- Kita manggil fungsi
tampilanAngka(10)
. - Lalu fungsi tersebut memanggil dirinya sendiri sebelum melakukan
print()
- Dia hanya akan melakukan
print()
ketika proses rekursif selesai, alias setelah pemanggilan fungsitampilanAngka()
yang kedua selesai. - Tapi, ternyata ketika memanggil yang kedua kalinya, dia langsung memanggil dirinya sendiri untuk yang ketiga kalinya. Dia hanya akan melakukan perintah
print()
ketika proses pemanggilan yang ketiga selesai. - Begitu lah seterusnya hingga proses rekursif berakhir, sehingga perintah
print()
yang pertama kali dilakukan adalah yang ketiga.
Masih Agak Bingung?
Jadi, alur dari kode di atas itu kalau kita bedah, kira-kira seperti ini:
i = 1
batas = 3
if i < batas:
iDua = i + 1
if iDua < batas:
iTiga = iDua + 1
if iTiga < batas:
iEmpat = iTiga + 1
if iEmpat < batas:
iLima = iEmpat + 1
# dan seterusnya
print(iLima)
print(iEmpat)
print(iTiga)
print(iDua)
print(i)
Coba teman-teman edit variabel batas
menjadi 4
, 5
, atau 2
. Lalu jalankan kodenya.
Masih Tetep Bingung?
Oke. Untuk lebih memperjelas, mari kita ubah kodingannya menjadi lebih ruwet ya π
Kita akan melakukan print()
sebanyak dua kali: yaitu sebelum dan sesudah pemanggilan fungsi rekursif.
Perhatikan kode berikut:
def tampilkanAngka (batas, i = 1):
prefix = '--' * (i - 1)
print(f'{prefix} Sebelum rekursif ({i})')
if (i < batas):
# di sini lah rekursifitas itu terjadi
tampilkanAngka(batas, i + 1)
print(f'{prefix} Setelah rekursif ({i})')
# memanggil fungsi tampilkanAngka
# untuk pertama kali
tampilkanAngka(5)
Jika dijalankan, hasilnya seperti ini:
Sebelum rekursif (1)
--Sebelum rekursif (2)
----Sebelum rekursif (3)
------Sebelum rekursif (4)
--------Sebelum rekursif (5)
--------Setelah rekursif (5)
------Setelah rekursif (4)
----Setelah rekursif (3)
--Setelah rekursif (2)
Setelah rekursif (1)
Penjelasan
Insyaallah saya kira sampai sini sudah cukup jelas alur dari fungsi rekursif ini seperti apa.
Kita bisa simpulkan bahwa:
Fungsi yang pertama kali dipanggil, adalah fungsi yang terakhir kali selesai. Dan fungsi yang terakhir kali dipanggil, ia adalah fungsi yang paling pertama selesai.
Tidak terasa, ternyata hanya untuk menjelaskan perulangan i sampai x saja lumayan panjang.
4 Contoh Program Rekursif Python
Untuk lebih memperdalam lagi bagaimana tentang penerapan fungsi rekursif pada python, saya ada beberapa contoh kasus yang menggunakan fungsi reskursif sebagai solusinya:
- Membuat Deret Fibonacci Dengan Perulangan Rekursif
- 4 Cara Menghitung Pangkat di Python (Salah Satunya Rekursif)
- 3 Cara Menghitung Faktorial di Python (Salah Satunya Rekursif)
- 2 Cara Manual Menghitung Nilai Maksimum dan Minimum di Python (Salah Satunya Rekursif)
Kode Program Lengkap
Untuk kalian yang ingin mengakses kode program lengkap dari pertemuan ini. Langsung saja kunjungi link ini.
Pertemuan Selanjutnya
Pada pertemuan selanjutnya pada seri tutorial python dasar ini, insyaallah kita akan membahas tema yang ringan-ringan saja. Yaitu tentang kata kunci atau statemen pass
pada python.
Stay tune ya! Tutorial dasar kita sudah mau selesai π€π€