SORU
22 Kasım 2008, CUMARTESİ


Tail Call Optimizasyonu Nedir?

Çok basit, tail call optimizasyonu nedir? Uygulanabilir, nerede ve neden bir açıklama ile değil daha spesifik olarak, herkes bazı küçük kod parçacıkları.

CEVAP
22 Kasım 2008, CUMARTESİ


Tail call optimizasyonu çağrılan işlev alır arama fonksiyonu değerini döndürür, çünkü yeni bir yığın çerçeve ayrılırken bir işlev için önlemek mümkün olabilir. En yaygın kullanımı, bir özyinelemeli işlevi yararlanmak için yazılı tail call optimizasyonu sürekli kullanmak yığın alanı nerede kuyruk özyineleme.

Program herhangi bir uygulama bu optimizasyonu sağlamak gerekir ki spec garantisi birkaç programlama dillerinden biridir(JavaScript de ES6 tamamlandıktan sonra)yani burada Düzeni: faktöriyel işlevi iki örnek

(define (fact x)
  (if (= x 0) 1
      (* x (fact (- x 1)))))

(define (fact x)
  (define (fact-tail x accum)
    (if (= x 0) accum
        (fact-tail (- x 1) (* x accum))))
  (fact-tail x 1))

İlk işlev özyinelemeli arama yapılırken, işlev çağrı döndükten sonra sonucu yapması gereken çarpma takip etmek gerekiyor çünkü kuyruk özyinelemeli değildir. Gibi, aşağıdaki gibi görünüyor yığını

(fact 3)
(* 3 (fact 2))
(* 3 (* 2 (fact 1)))
(* 3 (* 2 (* 1 (fact 0))))
(* 3 (* 2 (* 1 1)))
(* 3 (* 2 1))
(* 3 2)
6

Buna karşılık, kuyruk için yığın izleme özyinelemeli faktöriyel aşağıdaki gibi görünüyor

(fact 3)
(fact-tail 3 1)
(fact-tail 2 3)
(fact-tail 1 6)
(fact-tail 0 6)
6

Gördüğünüz gibi, biz sadece doğru yapana değer üstüne dönen, içinde bulunduğumuz çünkü aslında kuyruk için her arama için aynı miktarda veri kaydını tutmak zorunda. Bu çağrı için (aslında 1000000) olsam bile, sadece (aslında 3) olarak alan aynı miktarda ihtiyacım var anlamına gelir. Bu non-kuyruk özyinelemeli aslında durum böyle değildir, ve böyle büyük değerleri yığın taşmasına neden olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Capcom Unity

    Capcom Unity

    5 NİSAN 2010
  • Megan Parken

    Megan Parken

    19 Temmuz 2009
  • Willie D.

    Willie D.

    16 Aralık 2006