Sektörden Haberler

Tail Call Optimization Nedir?

18 Ağustos 2025 Pazartesi


Tail Call Optimization (TCO), bazı programlama dillerinde bulunan ve özyinelemeli (recursive) fonksiyonların daha verimli çalışmasını sağlayan bir optimizasyondur. Normalde bir fonksiyon kendi kendini çağırdığında her çağrı için yeni bir bellek alanı (stack frame) ayrılır. Bu da çok derin özyinelemelerde “stack overflow” hatasına yol açabilir.

TCO sayesinde, eğer fonksiyonun yaptığı son iş başka bir fonksiyonu çağırmaksa, mevcut stack frame yeniden kullanılır ve ek bellek tüketilmez. Yani özyinelemeler neredeyse döngü kadar verimli hale gelir.

Scheme, Haskell gibi fonksiyonel dillerde yaygınken, Clojure, Scala ve bazı JavaScript motorlarında da desteklenir. Derin özyinelemelerle çalışan algoritmalar için sessiz ama hayat kurtarıcı bir tekniktir.

Tail Call Optimization’ın pratik önemi, büyük veri üzerinde çalışan algoritmalarda ortaya çıkar. Normal özyineleme kullanıldığında her yeni çağrı bellekte birikerek sistemin sınırlarına dayanabilir. Ancak TCO sayesinde bu risk ortadan kalkar çünkü yeni çağrılar için ekstra bellek ayrılmaz. Bu özellik, özellikle fonksiyonel programlama dillerinde yazılan uygulamalarda hem performansı artırır hem de bellek taşmalarını engeller.

  • Kod Örneği: Normal Özyineleme ve Tail Call Optimization

Normal Özyineleme (stack büyür):

def factorial(n):

            if n == 0:

            return 1

            return n * factorial(n - 1)

print(factorial(5))  # 120

Bu versiyonda her factorial(n-1) çağrısı için yeni bir stack frame oluşturulur. Büyük sayılar için RecursionError hatası alınabilir.

Tail Call Optimization (stack sabit kalır – bazı dillerde otomatik optimize edilir):

def factorial_tco(n, acc=1):

            if n == 0:

            return acc

            return factorial_tco(n - 1, n * acc)

print(factorial_tco(5))  # 120

Burada acc (accumulator) sayesinde ara değer taşınır ve son işlem doğrudan bir fonksiyon çağrısı olduğu için TCO uygulanabilir. Python kendisi TCO yapmaz, ancak Scheme, Haskell gibi dillerde bu örnek tek stack frame ile çalışır.