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

  • George McCarron

    George McCar

    29 Mayıs 2013
  • Helder Barreto

    Helder Barre

    22 Mayıs 2006
  • THE RED DRAGON

    THE RED DRAG

    6 ŞUBAT 2009