SORU
29 AĞUSTOS 2008, Cuma


Kuyruk özyineleme nedir?

Buna rağmen öğrenmek için başlangıç, dönem rastladım lisptail-recursive. Bu ne anlama geliyor?

CEVAP
31 AĞUSTOS 2008, Pazar


Kuyruk özyineleme açıklanan önceki cevaplar içinde, ama eylem bir örnek bu kavramı göstermek için yardımcı olacağını düşünüyorum.

İlk N tamsayılar ekler basit bir işlevi göz önünde bulundurun. (*örneğin 4*).

Burada özyineleme kullanan basit bir Python uygulaması

def recsum(x):
 if x == 1:
  return x
 else:
  return x   recsum(x - 1)

Eğer recsum(5), ararsan bu Python yorumlayıcısı değerlendirmeniz nedir.

recsum(5)
5   recsum(4)
5   (4   recsum(3))
5   (4   (3   recsum(2)))
5   (4   (3   (2   recsum(1))))
5   (4   (3   (2   1)))
15

Her özyinelemeli çağrı Python yorumlayıcısı aslında toplamını hesaplama işini yapmaya başlamadan önce tamamlamak için nasıl unutmayın.

İşte aynı işlevi kuyruk özyinelemeli bir versiyonu:

def tailrecsum(x, running_total=0):
  if x == 0:
    return running_total
  else:
    return tailrecsum(x - 1, running_total   x)

Buradaysa tailrecsum(5) etkili 10 ** varsayılan ikinci tartışma yüzünden olacaktı) aradığını ortaya çıkabilecek olan olaylar dizisi.

tailrecsum(5, 0)
tailrecsum(4, 5)
tailrecsum(3, 9)
tailrecsum(2, 12)
tailrecsum(1, 14)
tailrecsum(0, 15)
15

Özyinelemeli çağrı her bir değerlendirme ile kuyruk özyinelemeli durumda, running_total güncellenir.

Yorumlarda bahsedilen, Python Python bunu yapmanın avantajı var-dahili kuyruk aramaları optimize etmek için destek yok. not: Ancak, decorator bir optimizasyon elde etmek için kullanabilirsiniz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Mark Hyder

    Mark Hyder

    6 EKİM 2011
  • martin shervington

    martin sherv

    7 EKİM 2011
  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013