SORU
10 EKİM 2008, Cuma


Tramplen işlevi nedir?

İş yerinde son tartışmalar sırasında, biri trambolin bir fonksiyon denir.

Wikipedia açıklamasını okudum. İşlevlerin genel bir fikir vermek için yeterlidir, ama bir şey biraz daha somut isterim.

Bir trambolin göstererek kodunu basit bir parçacık var mı?

CEVAP
28 Ocak 2009, ÇARŞAMBA


Orada da LİSP anlamda 'iyi' olarak Wikipedia'da tarif: . trambolin

Bazı LİSP kullanılan uygulamalar trambolin yinelenen bir döngü. çağırır thunk-döndüren fonksiyonlar. Bir tek trambolin için yeterli olur bir kontrol transferleri express program; bir program bu kadar ifade edilir trampolined veya""; trampolined tarzı bir program trampolined dönüştürme stil tarmbolin üstünde zıplamak. Trampolined işlevleri uygulamak için kullanılabilir kuyruk özyinelemeli işlev çağrıları stack-tabanlı diller

Bizi Javascript kullanıyoruz diyelim ve geçen tarzı devam tecrübesiz Fibonacci fonksiyonu yazmak istiyorum. Bunu biz neden örneğin - JS için bağlantı Şeması için geçerli değildir, ya da her neyse kullanmak için sunucu tarafı işlevleri çağırmak için hangi CPS ile oynamak için.

Bu yüzden, ilk denemem

function fibcps(n, c) {
    if (n <= 1) {
        c(n);
    } else {
        fibcps(n-1, function(x) {
            fibcps(n-2, function(y) {
                c(x y)})});
    }
}

Ama, n = 25 ile çalışan Firefox bir hata veriyor Çok fazla özyineleme!'. Şimdi bu tarmbolin üstünde zıplamak çözer bu sorun tam olarak (Javascript tail call optimizasyonu eksik). (Özyinelemeli) bir işlev çağrısı yapmak yerine, return (gene bir talimat bize bu işlev çağırmak için izin, bir döngü olarak yorumlanabilir.

function fibt(n, c) {
    function trampoline(x) {
        while (x && x.func) {
            x = x.func.apply(null, x.args);
        }
    }
    function fibtramp(n, c) {
        if (n <= 1) {
            return {func: c, args: [n]};
        } else {
            return {func: fibtramp, 
                    args: [n - 1,
                           function (x) {
                               return {func: fibtramp, 
                                       args: [n - 2,
                                              function (y) {
                                                  return {func: c,
                                                          args: [x   y]}}
					  ]}}]}}}
    trampoline({ func : fibtramp, args: [n, c] });
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Floortile83

    Floortile83

    16 Ocak 2010
  • Pocketnow

    Pocketnow

    14 EKİM 2007
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005