Cara menggunakan contoh program stack python

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.

Perhatian

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:

  1. Parameter batas akan selalu bernilai 10
  2. Sedangkan parameter i akan bernilai 1 sampai dengan 10.
  3. Lalu ketika variabel i sudah sama dengan nilai variabel batas, 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:

  1. Kita manggil fungsi tampilanAngka(10).
  2. Lalu fungsi tersebut memanggil dirinya sendiri sebelum melakukan print()
  3. Dia hanya akan melakukan print() ketika proses rekursif selesai, alias setelah pemanggilan fungsi tampilanAngka() yang kedua selesai.
  4. 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.
  5. 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 🤗🤗

Apa itu stack dalam python?

Stack adalah jenis struktur data yang menumpuk dan dimana item baru akan ditambahkan dan yang sudah ada akan dihapuskan. Semua penghapusan dan penyisipan dalam tumpukan dilakukan dari atas tumpukan, elemen terakhir yang ditambahkan akan menjadi yang pertama dihapus dari tumpukan.

Apa itu append pada python?

Append dan insert pada dasarnya memiliki fungsi yang sama yaitu untuk menambahkan nilai pada array, perbedaannya hanya pada kondisi penggunaannya. Fungsi append menambahkan nilai array pada urutan akhir. Sedangkan dengan fungsi insert kita bisa menambahkan nilai array pada posisi tertentu.