स्कैला नौसिखिया के रूप में, मैं किताबें, दस्तावेज़ पढ़ रहा हूं और http://aperiodic.net/phil/scala/s-99/ पर मिली समस्याओं को हल करने का प्रयास करता हूं। ऐसा लगता है कि सही स्कैला कोड समानांतरता को सुरक्षित बनाने और ताले का उपयोग करने से बचने के लिए लूप और चर के बजाए अपरिवर्तनीय मूल्यों (वैल्यू) और रिकर्सन पर आधारित है।स्कैला नौसिखिया: रिकर्सन और स्टैक ओवरफ्लो त्रुटि
उदाहरण के लिए, व्यायाम P22 के लिए एक संभव समाधान (http://aperiodic.net/phil/scala/s-99/p22.scala) है:
// Recursive.
def rangeRecursive(start: Int, end: Int): List[Int] =
if (end < start) Nil
else start :: rangeRecursive(start + 1, end)
बेशक इस कोड को कॉम्पैक्ट है और स्मार्ट लग रहा है लेकिन निश्चित रूप से, अगर प्रत्यावर्तन की संख्या अधिक है, आप करेंगे एक स्टैक ओवरफ्लो त्रुटि का सामना करें (रेंजक्रुसेसरिव (1,10000) उदाहरण के लिए कोई जेवीएम ट्यूनिंग नहीं है)। यदि आप अंतर्निहित List.range (https://github.com/scala/scala/blob/v2.9.2/src/library/scala/collection/immutable/List.scala#L1) के स्रोत को देखते हैं, तो आप देखेंगे कि लूप और वर्रों का उपयोग किया जाता है।
मेरा सवाल है कि स्केल सीखने वाली सामग्री के प्रभाव को कैसे प्रबंधित किया जाए जो vals और recursion को बढ़ावा दे रहा है यह जानकर कि इस तरह का कोड रिकर्सन की संख्या के कारण टूट सकता है?
स्कैला कंपाइलर [trampoolined] में संकलित पूंछ-रिकर्सिव कॉल बनाने के लिए पर्याप्त स्मार्ट है (http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html) पूंछ रिकर्सन (JVM टीसीई का समर्थन नहीं करता है), जो स्टैकवॉफ्लो को नहीं लेगा। यदि आप यह सुनिश्चित करना चाहते हैं कि आपका कोड पूंछ रिकर्सिव है, तो विधि हस्ताक्षर –