मैंने पूंछ रिकर्सिव विधि रखने के लिए @tailrec
एनोटेशन का उपयोग और पढ़ा है। मैं कई लिंक से गुजर चुका हूं जो इसे समझाते हैं। उदाहरण के लिए यह केवल तभी काम करता है जब स्व-कॉलिंग फ़ंक्शंस और कंधे ओवरड्रिड आदि नहीं हो।@tailrec कैसे काम करता है
हर जगह यह उल्लेख किया गया है कि compiler optimizes
। लेकिन कंपाइलर क्या पूंछ रिकर्सिव बनाने के लिए क्या जादू/अवधारणा करता है। नीचे एक सरल समारोह के लिए, संकलक क्या करना है:
@tailrec def fact(acc: Int, n: Int): Int = {
if (n <= 1) acc
else fact(n * acc, n - 1)
}
fact(1,10)
मेरा मतलब है कि यह एक पाश जहां यह बार-बार यह कहता है और उसके बाद में परिवर्तित करता है अंतिम मान देता है? वहाँ जो यह
मूल रूप से हाँ, स्केला संकलक कोड थोड़ी देर के पाश के समान बाईटकोड करने के लिए कोड में कनवर्ट करता है: तो यह वास्तव में कैसे यह पूंछ कॉल का अनुकूलन कर दिखाता है। यह शायद 'var acc = 1 की तरह कुछ कर रहा है; var n = 10; शुरू करें: अगर (एन <= 1) एक और वापस लौटें {acc = n * acc; एन = एन -1; गोटो शुरू} '। शरीर की शुरुआत में गेटो के साथ सभी पूंछ कॉलों को यांत्रिक रूप से प्रतिस्थापित करना संभव होना चाहिए। – huynhjl