TL; DR: İşlevsel diller özyinelemeyi işlevsel olmayan dillerden daha iyi idare ediyor mu?
Şu anda Kod Tamamlandı 2'yi okuyorum. Kitaptaki bir noktada yazar bizi özyineleme konusunda uyarıyor. Mümkün olduğunda kaçınılması gerektiğini ve özyineleme kullanan işlevlerin genellikle döngü kullanan bir çözümden daha az etkili olduğunu söylüyor. Örnek olarak, yazar böyle bir sayının faktörünü hesaplamak için özyinelemeyi kullanarak bir Java işlevi yazdı (şu anda benimle kitabım olmadığı için tam olarak aynı olmayabilir):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
Bu kötü bir çözüm olarak sunulmaktadır. Bununla birlikte, fonksiyonel dillerde, özyinelemeyi kullanmak genellikle işleri yapmanın tercih edilen yoludur. Örneğin, özyinelemeyi kullanarak Haskell'deki faktöriyel fonksiyon şudur:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
Ve yaygın olarak iyi bir çözüm olarak kabul edilir. Gördüğüm gibi, Haskell özyinelemeyi çok sık kullanıyor ve üzerine kaşlarını çattığını hiçbir yerde görmedim.
Yani sorum temelde:
- İşlevsel diller özyinelemeyi işlevsel olmayan dillerden daha mı iyi yapıyor?
EDIT: Kullandığım örneklerin sorumu açıklamak için en iyi olmadığının farkındayım. Sadece Haskell'in (ve genel olarak işlevsel dillerin) özyinelemeyi işlevsel olmayan dillerden daha sık kullandığını belirtmek istedim.
factorial n = product [1..n]
daha özlü, daha verimli ve yığın için büyük taşma yapmaz n
(ve eğer not almanız gerekiyorsa, tamamen farklı seçenekler gerekir). product
Bazı açısından tanımlanmaktadır fold
ki, bir yinelemeli tanımlanmış, ancak son derece dikkatli. Özyineleme olduğunu çoğu zaman kabul edilebilir bir çözüm, ancak bunu yanlış / Suboptimal yapmak kolay hala.