Kuyruk özyineleme nedir?
Buna rağmen öğrenmek için başlangıç, dönem rastladım lisptail-recursive. Bu ne anlama geliyor?
CEVAP
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.
Scala destek kuyruk özyineleme optimiz...
Kuyruk özyineleme Python optimize mu?...
Kuyruk özyinelemeli fonksiyon optimize...
Neden't değil .Kuyruk özyineleme ...
Varsa hangi C derleyicileri kuyruk özy...