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

  • Curso Online Gratuito

    Curso Online

    4 Aralık 2011
  • geraldnonadoez

    geraldnonado

    3 Temmuz 2013
  • jocc talking shit

    jocc talking

    6 NİSAN 2007