0Pricing
Scala for Backend Engineering & Functional Programming · Ders

Özyineleme Temelleri

Özyinelemeli işlevler

Özyineleme Temelleri, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 dersinin 1. 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, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

Özyineleme Nedir?

Özyineleme, bir işlevin aynı problemin daha küçük bir sürümünü çözmek için kendisini çağırmasıdır. İşlevsel programlamaya doğal biçimde uyar ve birçok döngünün yerini kendine başvuran tanımlarla doldurur.

İki Temel Bölüm

Doğru çalışan her özyinelemeli işlevin şunlara ihtiyacı vardır:

  • Özyinelemeyi durduran bir temel durum.
  • Temel duruma doğru ilerleyen bir özyinelemeli durum.

Ulaşılabilir bir temel durum yoksa özyineleme sonsuza kadar sürer.

Faktöriyel

Klasik örnek: n! = n * (n-1)!; temel durum olarak 0! = 1 kullanılır.

object Main {
  def factorial(n: Int): Int =
    if (n <= 1) 1
    else n * factorial(n - 1)

  def main(args: Array[String]): Unit = {
    println(factorial(5))
  }
}

Çağrıların İzlenmesi

Her özyinelemeli çağrı duraklar ve iç çağrının sonucunu bekler. factorial(3), 3 * (2 * (1)) biçimine açılır. Çarpma işlemleri, çağrılar geri dönerken gerçekleştirilir.

object Main {
  def factorial(n: Int): Int = {
    println(s"entering factorial($n)")
    if (n <= 1) 1 else n * factorial(n - 1)
  }

  def main(args: Array[String]): Unit = {
    println("result = " + factorial(3))
  }
}

Listenin Toplamı

Liste üzerinde özyineleme: toplam, baş ile kuyruğun toplamından oluşur; boş listenin toplamı sıfırdır.

object Main {
  def sum(xs: List[Int]): Int = xs match {
    case Nil     => 0
    case h :: t  => h + sum(t)
  }

  def main(args: Array[String]): Unit = {
    println(sum(List(1, 2, 3, 4)))
  }
}

Listenin Uzunluğu

Aynı örüntü uzunluğu da hesaplar: boş listenin uzunluğu 0'dır; aksi durumda sonuç, kuyruğun uzunluğuna 1 eklenmesidir.

object Main {
  def length[A](xs: List[A]): Int = xs match {
    case Nil    => 0
    case _ :: t => 1 + length(t)
  }

  def main(args: Array[String]): Unit = {
    println(length(List("a", "b", "c")))
  }
}

Çağrı Yığını

Bekleyen her özyinelemeli çağrı bir yığın çerçevesi kullanır. Derin özyineleme çok sayıda çerçeği yığına ekler. Çok büyük girdilerde bu durum yığını tüketebilir ve StackOverflowError oluşturabilir.

Fibonacci

Bazı problemler birden fazla özyinelemeli çağrıya dallanır. Fibonacci kendisini iki kez çağırır; bu zarif bir çözüm olsa da maliyeti üstel biçimde artar.

object Main {
  def fib(n: Int): Int =
    if (n < 2) n
    else fib(n - 1) + fib(n - 2)

  def main(args: Array[String]): Unit = {
    println(fib(10))
  }
}

Bir Listeyi Ters Çevirme

Özyineleme yeni yapılar oluşturabilir: reverse, kuyruğu ters çevirdikten sonra başı sona ekler.

object Main {
  def reverse[A](xs: List[A]): List[A] = xs match {
    case Nil    => Nil
    case h :: t => reverse(t) :+ h
  }

  def main(args: Array[String]): Unit = {
    println(reverse(List(1, 2, 3)))
  }
}

Özyineleme ve Yineleme

Döngüler bir sayacı değiştirir; özyineleme problemi bildirime dayalı biçimde ifade eder. İkisi de geçerlidir. Özyineleme, ağaç biçimli veriler ve böl-parçala-birleştir yaklaşımı için özellikle uygundur; ancak saf özyineleme, büyük doğrusal girdilerde yığın taşmasına yol açabilir.

En Büyük Ortak Bölen

Öklid algoritması doğal olarak özyinelemelidir ve hızla yakınsar.

object Main {
  def gcd(a: Int, b: Int): Int =
    if (b == 0) a else gcd(b, a % b)

  def main(args: Array[String]): Unit = {
    println(gcd(48, 18))
  }
}

Hızlı Kontrol

Özyinelemenin temellerini sınayın.

Özet

Özyinelemenin temellerini öğrendiniz:

  • Her özyinelemeli işlevin bir temel duruma ve bir özyinelemeli duruma ihtiyacı vardır.
  • Bekleyen her çağrı bir yığın çerçevesi kullanır; derin özyineleme yığın taşmasına neden olabilir.
  • Özyineleme, liste ve ağaç algoritmalarını doğal biçimde ifade eder.

Sonraki bölümde, @tailrec açıklamasıyla özyinelemeyi yığın açısından güvenli hâle getireceksiniz.

Sıkça Sorulan Sorular

“Özyineleme Temelleri” dersi ücretsiz mi?

Evet — “Özyineleme Temelleri” 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 Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

“Özyineleme Temelleri” dersinde ne öğreneceğim?

Özyinelemeli işlevler Scala for Backend Engineering & Functional Programming 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.

Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, 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 1. dersidir.

“Özyineleme Temelleri” 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 Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Scala for Backend Engineering & Functional Programming 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. Özyineleme Temelleri
  2. tailrec Açıklaması
  3. Biriktirici Örüntüsü
  4. Sıçrama Mekanizması
← Scala for Backend Engineering & Functional Programming Sayfasına Dön