Last Updated on December 14, 2022 by
Kotlin recursion merupakan fungsi yang melakukan pemanggilan terhadap dirinya sendiri. Kali ini, kami akan mengajak Anda mempelajari apa itu Kotlin recursion (fungsi recursive Kotlin) dan juga fungsi tail recursive.
Pernahkah Anda mendengar istilah recursive dan recursion sebelumnya? Secara teori, recursive adalah fungsi di Kotlin yang mampu memanggil dirinya sendiri. Sedangkan teknik pemanggilannya dikenal sebagai recursion.
Teknik recursive juga bisa terjadi di dunia nyata. Ambil contoh penempatan dua cermin paralel yang saling berhadapan. Objek apapun yang Anda tempatkan nantinya di antara mereka akan dipantulkan secara recursive.
Table of Contents
Cara Kerja Kotlin Recursion
Bagaimana cara kerja fungsi recursion di Kotlin programming? Struktur pemanggilan recursion adalah sebagai berikut:
fun main(args: Array<String>) { ... .. ... recurse() ... .. ... } fun recurse() { ... .. ... recurse() ... .. ... }
Pada contoh di atas, fungsi recurse() dipanggil dari badan fungsi recurse() juga. Cara kerja program ini dapat disimak selengkapnya pada gambar diagram berikut:
Di sini, panggilan rekursif terus berlanjut dalam jangka waktu panjang dan menyebabkan infinite recursion (recursion tidak terbatas).
Namun Anda bisa menghindarinya dengan menggunakan metode if…else (atau pendekatan lain yang sejenis). Gunakan if…else jika ada satu cabang kode yang terus memanggil recrusive, namun yang lainnya tidak.
Contoh: Menemukan Angka Faktorial dengan Kotlin Recursion
Kode berikut adalah contoh fungsi recursion untuk menemukan angka faktorial:
fun main(args: Array<String>) { val number = 4 val result: Long result = factorial(number) println("Factorial of $number = $result") } fun factorial(n: Int): Long { return if (n == 1) n.toLong() else n*factorial(n-1) }
Adapun hasil dari program di atas saat dijalankan adalah:
Factorial of 4 = 24
Cara Kerja Kotlin Recursion Faktorial()
Berikutnya ada fungsi factorial(). Cara kerja panggilan recursive factorial() bisa Anda simak selengkapnya pada diagram berikut:
Jika dirangkum, maka tahap-tahap pemanggilan fungsi factorial() adalah:
factorial(4) // 1st function call. Argument: 4 4*factorial(3) // 2nd function call. Argument: 3 4*(3*factorial(2)) // 3rd function call. Argument: 2 4*(3*(2*factorial(1))) // 4th function call. Argument: 1 4*(3*(2*1)) 24
Kotlin Tail Recursion
Setelah memahami apa itu Kotlin recursion, kini waktunya menyimak fungsi recursion lainnya, yakni tail.
Tail recursion lebih merupakan sebuah konsep general alih-alih fitur khusus di bahasa pemrograman Kotlin. Beberapa bahasa pemrograman, termasuk Kotlin, menggunakan tail untuk mengoptimalkan panggilan recursive. Namun ada juga bahasa programming yang tidak mendukungnya, seperti Phyton.
Apa Itu Tail Recursion?
Dalam rekursi normal, kita melakukan semua panggilan recursive terlebih dahulu, lalu dilanjutkan dengan menghitung hasil dari nilai yang dikembalikan (return values) di akhir—seperti yang diperlihatkan pada contoh di atas. Maka dari itu, kita tidak bisa memperoleh seluruh hasil hingga semua panggilan recursive dilakukan.
Namun seluruh proses tersebut berjalan berkebalikan di tail recursion. Di sini perhitungan dilakukan di awal, baru diikuti dengan pemanggilan recursive (panggilan recursive pun meneruskan hasil dari tahapan yang Anda proses saat ini ke panggilan berikutnya).
Cara kerja ini pula mengakibatkan panggilan recursive menjadi setara dengan perulangan (looping), sekaligus mencegah timbulnya resiko stack overflow.
Kondisi Terjadinya Tail Recursion
Sebuah fungsi recursive dinyatakan memenuhi syarat untuk tail recursion apabila panggilan ke diri sendiri tersebut merupakan operasi yang terakhir dilakukan. Contohnya adalah sebagai berikut:
Contoh 1: Pemrograman berikut tidak memenuhi syarat untuk tail recursion karena fungsi panggilan ke diri sendiri n*factorial(n-1) bukanlah operasi yang terakhir.
fun factorial(n: Int): Long { if (n == 1) { return n.toLong() } else { return n*factorial(n - 1) } }
Contoh 2: Kode ini memenuhi syarat untuk tail recursion karena fungsi panggilan ke diri sendiri fibonacci(n-1, a+b, a) adalah operasi yang terakhir.
fun fibonacci(n: Int, a: Long, b: Long): Long { return if (n == 0) b else fibonacci(n-1, a+b, a) }
Catatan penting: tandai fungsi dengan penanda tailrec agar kompiler memahami bahwa Anda ingin melakukan tail recursion.
Contoh 1: Kotlin Tail Recursion
Simaklah contoh berikut ini untuk menambah pemahaman Anda mengenai pemanfaatan tail recursion di Kotlin:
import java.math.BigInteger fun main(args: Array<String>) { val n = 100 val first = BigInteger("0") val second = BigInteger("1") println(fibonacci(n, first, second)) } tailrec fun fibonacci(n: Int, a: BigInteger, b: BigInteger): BigInteger { return if (n == 0) a else fibonacci(n-1, b, a+b) }
Jika program di atas dijalankan, maka hasilnya akan menjadi:
354224848179261915075
Program ini menghitung hasil ke-100 dari rangkaian seri Fibonacci. Contoh di atas juga menggunakan class BigInteger yang diimpor dari perpustakaan standar Java mengingat output yang dihasilkan bisa berupa bilangan bulat yang sangat besar.
Fungsi fibonacci() di sini pun turut ditandai dengan penanda tailrec sehingga kode memenuhi syarat untuk mengeksekusi panggilan tail recursive. Pada akhirnya, kompiler pun mengoptimalkan proses recursion.
Jika Anda mencoba mencari tahu hasil perhitungan Fibonacci ke-20.000 (atau yang lebih besar lagi) tanpa menggunakan tail recursion, maka kompiler akan membuang pengecualian java.lang.StackOverflowError.
Namun, contoh program di atas tetap berfungsi dengan baik akibat penggunaan tail recursion tadi. Perhitungan angka faktorial berjalan dengan recursion berbasis loop yang efisien alih-alih yang “tradisional”.
Contoh 2: Pemfaktoran Menggunakan Tail Recursion
Sayangnya, contoh koding perhitungan faktorial di atas tidak dapat digunakan untuk optimalisasi tail recursion. Sebagai gantinya, Anda bisa memakai program berikut ini:
fun main(args: Array<String>) { val number = 5 println("Factorial of $number = ${factorial(number)}") } tailrec fun factorial(n: Int, run: Int = 1): Long { return if (n == 1) run.toLong() else factorial(n-1, run*n) }
Hasil keluaran dari program di atas adalah:
Factorial of 5 = 120
Kompiler dapat mengoptimalkan recursion dalam program ini karena fungsi recursive memenuhi syarat untuk tail recursion. Contoh di atas juga menggunakan penanda tailrec yang memberitahu kompiler untuk mengoptimalkan proses recursion.
Itulah dia pembahasan mengenai apa itu Kotlin recursion beserta cara kerjanya. Semoga ulasan kali ini bermanfaat menambah wawasan Anda terkait Kotlin programming, ya!
Mau belajar coding secara gratis? Yuk baca CODEKEY sekarang di https://codekey.id/, karena ada ratusan tutorial programming spesial menanti Anda. Sampai bertemu lagi di seri belajar koding selanjutnya!
Jasa Pembuatan Aplikasi, Website dan Internet Marketing | PT APPKEY
PT APPKEY adalah perusahaan IT yang khusus membuat aplikasi Android, iOS dan mengembangkan sistem website. Kami juga memiliki pengetahuan dan wawasan dalam menjalankan pemasaran online sehingga diharapkan dapat membantu menyelesaikan permasalahan Anda.