Yinelemeli sürüm neden daha uzun sürüyor?


11

Http://programming.lispdream.com/blog/2011/06/recursion-vs-iteration/ adresine bakıyordum ve faktöriyel fonksiyonun özyinelemeli ve yinelemeli uygulamalarını uygularken, yinelemenin aslında daha uzun sürdüğünü gördüm verilen n = 1.000. Nedenini anlayamıyorum (açıklamıyor, ancak bunun okuyucu için bir egzersiz olduğunu söylüyor). Bütün bunlara yeniliğim için özür dilerim.

Yanıtlar:


10

İki program eşdeğer değildir. Özyinelemeli sürüm hesaplanıyor

(... ((1 * 2) * 3) * 4 ... * n)

yinelemeli olan hesaplanırken

(... ((n * (n-1)) * (n-2) ... * 1)

bu nedenle ara miktarlar yinelemeli versiyon için daha hızlı büyür ve dahil olan sayılar küçük olduğunda büyük num hesaplaması daha hızlıdır (1000!


1

Özyinelemeli algoritma yinelemesi yaptığınızda, sonuçları izleyen yığını açıkça uygulamanız gerekir. Bu eylem, özyinelemeli algoritmanın ücretsiz olarak elde ettiği yığını itme ve haşhaşla ilgili ek işlemler ekler (oldukça ücretsiz değildir, ancak ekstra işlemler özyineleme maliyetinden daha fazlasını ekler).


1
Programlara baktınız mı? Yinelemeli faktöriyör bir yığını hiç manipüle etmez.
AProgrammer

-1

Sadece tahmin edebilirim, bu kriterler C'den mi yoksa SBLC kodundan mı emin değilim. Sanırım suçlu değişkeni değiştiriyor. 1000! oldukça büyük bir sayıdır, belki de yığınları ara katmanlarla doldurmak ve temizlemek bir kopya oluşturmak ve üzerine yazmaktan daha hızlıdır.


Bunlar SBCL kodundan geliyor.
martinjacobd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.