0Pricing
Kotlin Academy · Ders

tailrec İşlevleri

Özyinelemeyi iyileştirin

tailrec İşlevleri, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Kuyruk Özyineleme Nedir

Bir işlev, özyinelemeli çağrısı yaptığı son işlem olduğunda kuyruk özyinelemelidir. Kotlin bunu bir döngüye dönüştürerek iyileştirebilir ve yığın taşmasını önleyebilir.

tailrec fun countdown(n: Int) {
    if (n < 0) return
    println(n)
    countdown(n - 1)
}

fun main() {
    countdown(3)
}

tailrec Değiştiricisi

tailrec değiştiricisini eklediğinizde derleyici, özyinelemeyi yinelemeye dönüştürür ve sabit miktarda yığın alanı kullanır.

tailrec fun sum(n: Int, acc: Int = 0): Int {
    if (n == 0) return acc
    return sum(n - 1, acc + n)
}

fun main() {
    println(sum(100))
}

Accumulator Örüntüsü

Özyinelemeyi kuyruk biçimine dönüştürmek için sonuçları bir Accumulator parametresinde taşıyın; böylece çağrıdan sonra hesaplanacak hiçbir şey kalmaz.

tailrec fun factorial(n: Int, acc: Long = 1): Long {
    if (n <= 1) return acc
    return factorial(n - 1, acc * n)
}

fun main() {
    println(factorial(10))
}

Çağrı Neden Son İşlem Olmalı

Özyinelemeli çağrıdan sonra herhangi bir işlem yapılırsa (örneğin sonucu çarpmak), çağrı kuyruk konumunda değildir ve iyileştirilemez.

tailrec fun length(s: String, acc: Int = 0): Int {
    if (s.isEmpty()) return acc
    return length(s.drop(1), acc + 1)
}

fun main() {
    println(length("hello"))
}

Kuyruk Özyinelemeli Olmayan Karşı Örnek

Bu faktöriyel işlevi NOT kuyruk özyinelemeli değildir; çünkü çarpma, çağrı döndükten sonra gerçekleşir. Bunu tailrec ile işaretlemek bir uyarıya neden olur.

fun badFactorial(n: Int): Long {
    if (n <= 1) return 1
    return n * badFactorial(n - 1)
}

fun main() {
    println(badFactorial(5))
}

Yığın Taşmasını Önleme

tailrec olmadan yapılan derin özyineleme çökmeye neden olabilir. Bununla birlikte büyük girdiler bile sabit miktarda yığın alanında çalışır.

tailrec fun count(n: Int, acc: Int = 0): Int {
    if (n == 0) return acc
    return count(n - 1, acc + 1)
}

fun main() {
    println(count(100000))
}

Derleyici Doğrulaması

Bir işlevi tailrec ile işaretlediğiniz hâlde çağrı kuyruk konumunda değilse derleyici bir uyarı verir ve iyileştirme yapmaz. Uyarıya güvenin.

tailrec fun gcd(a: Int, b: Int): Int {
    if (b == 0) return a
    return gcd(b, a % b)
}

fun main() {
    println(gcd(48, 18))
}

Kuyruk Özyineleme ve Döngü

tailrec işlevi, kabaca eşdeğer döngüyle aynı koda derlenir; ancak algoritmayı özyinelemeli olarak ifade eder.

tailrec fun powerOfTwo(n: Int, acc: Long = 1): Long {
    if (n == 0) return acc
    return powerOfTwo(n - 1, acc * 2)
}

fun main() {
    println(powerOfTwo(10))
}

Birden Çok Parametre

Kuyruk özyinelemeli işlevler genellikle, tümü özyinelemeli çağrıda güncellenen birkaç durum parametresini aktarır.

tailrec fun fib(n: Int, a: Long = 0, b: Long = 1): Long {
    if (n == 0) return a
    return fib(n - 1, b, a + b)
}

fun main() {
    println(fib(20))
}

tailrec ile Ters Çevirme

Bir Accumulator, ters çevrilmiş bir dize gibi bir sonuç oluşturabilir.

tailrec fun reverse(s: String, acc: String = ""): String {
    if (s.isEmpty()) return acc
    return reverse(s.drop(1), s.first() + acc)
}

fun main() {
    println(reverse("kotlin"))
}

Uygulamalı Bir Arama

Yinelemeli aramalar, kuyruk özyinelemeye kolayca dönüştürülebilir.

tailrec fun indexOf(list: List<Int>, target: Int, i: Int = 0): Int {
    if (i >= list.size) return -1
    if (list[i] == target) return i
    return indexOf(list, target, i + 1)
}

fun main() {
    println(indexOf(listOf(5, 6, 7), 7))
}

Hızlı Sınama

tailrec işlevleri konusundaki anlayışınızı sınayın.

Özet

tailrec işlevlerini öğrendiniz:

  • tailrec, kuyruk konumundaki özyinelemeyi bir döngüye dönüştürerek yığın taşmasını önler.
  • Özyinelemeli çağrı son işlem olmalıdır.
  • Kuyruk biçimine ulaşmak için bir Accumulator parametresi kullanın.
  • Bir işlev iyileştirilemediğinde derleyici uyarı verir.
tailrec fun sum(n: Int, acc: Int = 0): Int =
    if (n == 0) acc else sum(n - 1, acc + n)

fun main() {
    println(sum(50))
}

Sıkça Sorulan Sorular

“tailrec İşlevleri” dersi ücretsiz mi?

Evet — “tailrec İşlevleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“tailrec İşlevleri” dersinde ne öğreneceğim?

Özyinelemeyi iyileştirin Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“tailrec İşlevleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Infix İşlevleri
  2. DSL Benzeri API'ler Oluşturma
  3. tailrec İşlevleri
  4. Her Birini Ne Zaman Kullanmalı
← Kotlin Academy Sayfasına Dön