Özyineleme (recursion) ile iterasyon arasındaki farklar nelerdir?

Cevap

Özyineleme, bir fonksiyonun problemi küçülterek kendini çağırmasıdır. Her özyinelemeli fonksiyonda iki parça olmalıdır:

  • Taban durumu (base case): özyinelemeyi durdurur.
  • Özyinelemeli adım: problemi taban duruma yaklaştırır.
def factorial_rec(n):
    if n <= 1:            # taban durumu
        return 1
    return n * factorial_rec(n - 1)

def factorial_iter(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result
Özyinelemeİterasyon
BellekHer çağrı için call stack çerçevesi, O(derinlik)Genelde O(1)
RiskStack overflow (Python'da varsayılan limit ~1000)Sonsuz döngü
OkunabilirlikAğaç, graf, böl-ve-yönet için doğalDoğrusal işlemler için doğal
PerformansFonksiyon çağrısı maliyetiGenelde biraz daha hızlı

Notlar

  • Her özyineleme, açık bir stack kullanılarak iterasyona çevrilebilir.
  • Tail call optimization: son işlem özyinelemeli çağrıysa bazı diller (Scheme, bazı derleyiciler) stack büyütmez; Python ve Java bunu yapmaz.
  • Örtüşen alt problemlerde (Fibonacci) naif özyineleme üstel süre alır; memoization gerekir.
  • Ağaç gezinme, permütasyon üretme, backtracking gibi problemlerde özyineleme kodu çok daha sade yapar.
  1. Binary search'ün zaman karmaşıklığı nedir ve neden?KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  2. Two Sum: toplamı hedefe eşit olan iki elemanın indekslerini bulun.KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  3. Bir parantez dizisinin geçerli olup olmadığını kontrol edin: "({[]})"KolayAlgoritmalar & Veri YapılarıYazılım Müh.
  4. Tek yönlü bağlı listeyi ters çevirin.OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  5. BFS ve DFS arasındaki fark nedir? Hangisini ne zaman kullanırsınız?OrtaAlgoritmalar & Veri YapılarıYazılım Müh.
  6. get ve put işlemleri O(1) olan bir LRU Cache tasarlayın.ZorAlgoritmalar & Veri YapılarıYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle