CodeBlanks Logo Icon CodeBlanks

Tailrec

tailrec ile özyineleme güvenliği öğrenirsin.

tailrec ne işe yarar?

tailrec, özyinelemeli (recursive) bir fonksiyonun kuyruk özyinelemeli olmasını sağlar; derleyici onu bir döngüye dönüştürür. Böylece büyük girdilerde yığın taşması olmaz.

Örnek: tailrec fun sumTo(n: Long, acc: Long = 0L): Long = if (n <= 0L) acc else sumTo(n - 1L, acc + n). Burada özyineleme çağrısı fonksiyonun son adımıdır; bu kuyruk çağrısıdır. tailrec işareti yoksa Kotlin bunu döngüye çevirmez; büyük n değerlerinde yığın taşması riski doğar. Kuyruk çağrısı olmayan fonksiyonlarda tailrec uyarı verir.

Akümülatörlü özyineleme

Bir çok özyinelemeli fonksiyon, kuyruk çağrıya dönüştürülebilir; bunun için bir akümülatör parametresi eklenir. Akümülatör, ara sonucu taşır.

Örnek: tailrec fun factorial(n: Long, acc: Long = 1L): Long = if (n <= 1L) acc else factorial(n - 1L, acc * n). Burada acc ara çarpımı tutar; her adımda n azalır, acc büyür. Çağrı: factorial(5L). Sonuç 120. Bu yapı büyük girdilerde de güvenle çalışır.

Uygulama tailrec sumTo yaz

tailrec fun sumTo(n: Long, acc: Long = 0L): Long tanımla. n <= 0L ise acc döndürsün; değilse sumTo(n - 1L, acc + n) çağrısı yapsın. main içinde println(sumTo(10L)) yaz.

Başlangıç kodu

Main.kt
// anahtar sözcüğü ekle
fun sumTo(n: Long, acc: Long = 0L): Long =
    if (n <= 0L) acc else TODO("özyinelemeyi ekle")

fun main() {
    // sonucu yazdır
}

Örnek çözüm

Main.kt
tailrec fun sumTo(n: Long, acc: Long = 0L): Long =
    if (n <= 0L) acc else sumTo(n - 1L, acc + n)
fun main() {
    println(sumTo(10L))
}

Beklenen çıktı

55

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 tailrec hangi durumda çalışmaz?

  • Özyineleme çağrısı fonksiyonun son adımıysa
  • Akümülatör (acc) parametresi varsa
  • Özyineleme çağrısından sonra başka işlem yapılırsa Doğru cevap
  • Long türü kullanılırsa

Açıklama: tailrec yalnızca gerçek kuyruk çağrılarında çalışır.

2 tailrec anahtar sözcüğünü ekle

Soru
____ fun sumTo(n: Long, acc: Long = 0L): Long =
    if (n <= 0L) acc else sumTo(n - 1L, acc + n)
Cevap
tailrec fun sumTo(n: Long, acc: Long = 0L): Long =
    if (n <= 0L) acc else sumTo(n - 1L, acc + n)

Açıklama: tailrec, kuyruk özyinelemeyi döngüye çevirir.

3 tailrec parçalarını eşle

Kavram Anlamı
tailrec Döngüye çevirme işareti
acc Akümülatör
n - 1L Azalan girdi
if (n <= 0L) Temel durum

Uzman bölümündeki tüm dersler