SORU
20 Mart 2013, ÇARŞAMBA


Kuyruk özyineleme tam olarak nasıl çalışır?

Neredeyse ne kadar kuyruk çalışıyor ve bu arasındaki fark normal bir özyineleme anlamak. Bensadecebunu neden yaptığını anlamıyorumyokdönüş adresini hatırlamak yığın gerektirir.

// tail recursion
int fac_times (int n, int acc) {
    if (n == 0) return acc;
    else return fac_times(n - 1, acc * n);
}

int factorial (int n) {
    return fac_times (n, 1);
}

// normal recursion
int factorial (int n) {
    if (n == 0) return 1;
    else return n * factorial(n - 1);
}

Kendisi bir işlevi kuyruk özyineleme işlev çağrıldıktan sonra yapacak bir şey yok ama benim için anlam ifade etmiyor.

CEVAP
20 Mart 2013, ÇARŞAMBA


Derleyici sadece bu dönüşümü mümkün

int fac_times (int n, int acc) {
    if (n == 0) return acc;
    else return fac_times(n - 1, acc * n);
}

böyle bir şeye:

int fac_times (int n, int acc) {
label:
    if (n == 0) return acc;
    acc *= n--;
    goto label;
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Boiler Room

    Boiler Room

    10 Mayıs 2012
  • Brendan van Son

    Brendan van

    5 Aralık 2006
  • Fullscreen

    Fullscreen

    23 Mart 2006