कुछ कारणों से रूबी बाएं रिकर्सन का सामना करते समय बेहतर प्रदर्शन कर रहा है। उदाहरण के लिए:रूबी बाएं बनाम सही रिकर्सन
def left_recursive_factorial(number)
return 1 if number.zero?
left_recursive_factorial(number.pred) * number
end
def right_recursive_factorial(number)
return 1 if number.zero?
number * right_recursive_factorial(number.pred)
end
जब मैं 9000 से अधिक एक मूल्य के साथ इन तरीकों() मैं अलग परिणाम प्राप्त फोन:
left_recursive_factorial(9001)
# => factorial of 9001
right_recursive_factorial(9001)
# => SystemStackError: stack level too deep
# from (pry):6:in `right_recursive_factorial'
मैं इस व्यवहार के लिए कोई स्पष्टीकरण नहीं पा सके।
कुछ हद तक संबंधित चीज लगभग LL()
पार्सर्स को बाएं रिकर्सन के साथ समस्याएं थीं और मुझे लगता है कि आप इसे चारों ओर फ़्लिप कर सकते हैं, लेकिन मैंने इसमें बहुत कुछ खोला नहीं है।
क्या कोई थोड़ा और विस्तार से बता सकता है कि अलग-अलग प्रदर्शन करने के लिए बाएं और दाएं रिकर्सन का कारण बनता है (आमतौर पर और रूबी विशेष रूप से) और यदि आपके पास एक या दूसरे को चुनने की संभावना है तो आप इसे क्यों चुनेंगे (और क्यों छोड़ा गया था रुबी में चुना गया)?
ऐसा लगता है कि रूबी बाएं से पहले गुणा के दाहिने तरफ का मूल्यांकन करता है, और इसलिए बायां संस्करण [पूंछ रिकर्सन] (https://en.wikipedia.org/wiki/Tail_call) का उपयोग करता है, इसलिए इसे नहीं करना है ढेर पर जोड़ें। – clcto
@clcto: यह पूंछ कॉल उन्मूलन की तरह दिखता नहीं है। एक के लिए, गुणा समारोह में अंतिम ऑपरेशन है, रिकर्सिव कॉल नहीं। दूसरे के लिए, यदि आप केवल 9500 तक की संख्या बढ़ाते हैं तो भी आप स्टैक को उड़ा देंगे। – Chuck
@clcto रूबी सबसे निश्चित रूप से ऑपरेटरों और विधि तर्कों को बाएं से दाएं, दाएं से बाएं नहीं मानते हैं। इसके अलावा जिस क्रम में ऑपरेंड का मूल्यांकन किया जाता है, वह इस बात के संबंध में अप्रासंगिक है कि कुछ पूंछ रिकर्सिव है या नहीं। गुणा आवश्यक रूप से फ़ंक्शन कॉल के बाद होता है (क्योंकि जब तक आप दोनों संख्याओं को नहीं जानते हैं तब तक आप दो संख्याओं को गुणा नहीं कर सकते हैं), इसलिए विधि पूंछ-रिकर्सिव नहीं है, इससे कोई फर्क नहीं पड़ता कि किस नंबर का मूल्यांकन पहले किया जाता है। और किसी भी तरह से मानक रूबी दुभाषिया पूंछ रिकर्सन अनुकूलित नहीं करता है। – sepp2k