क्या रुबी में रिकर्सिव फ़ंक्शंस में स्टैक ओवरफ़्लो त्रुटियों के लिए कोई कामकाज है?क्या रिकर्सिव रूटीन में "स्टैक लेवल बहुत गहरी" त्रुटियों के लिए कोई कामकाज है?
def countUpTo(current, final)
puts current
return nil if current == final
countUpTo(current+1, final)
end
अगर मैं फोन countUpTo(1, 10000)
, मैं कोई त्रुटि मिलती है: stack level too deep (SystemStackError)
कहते हैं, उदाहरण के लिए, मैं इस ब्लॉक की है।
यह 8187. में तोड़ने के लिए प्रकट होता है वहाँ कुछ समारोह है कि मैं ढेर के आकार, या अधिकतम ढेर आकार बढ़ाने के लिए एक तरह से अनदेखी करने के लिए रूबी कह कॉल कर सकते हैं है?
ऐसा मत करो। यदि आप जानबूझकर 10,000 बार पुन: उपयोग कर रहे हैं, तो आप इसे बहुत गलत कर रहे हैं और पुनरावृत्ति का दुरुपयोग कर रहे हैं। – meagar
रूबी कार्यान्वयन जरूरी नहीं है कि पूंछ कॉल उन्मूलन करें, इसलिए आप सी स्टैक आकार का उपयोग करने पर भरोसा कर रहे हैं। एक संभावना यह है कि आप अपने कार्य को पुनरावृत्त करने के लिए पुनः लिख सकते हैं। – birryree
सबसे पहले, रूबी के साथ मेरा स्वयं का अनुभव यह है कि यह रिकर्सन के साथ विशेष रूप से अच्छा नहीं है, जिसमें यह इस तरह की त्रुटियों को आसानी से उत्पन्न करता है और यह धीमा है (आप चाहते हैं कि इससे भी कम)। इसके अलावा, इस क्षेत्र में बेहतर प्रदर्शन करने के लिए आपको रूबी को एक निश्चित स्थिर सेट के साथ संकलित करने की आवश्यकता है, लेकिन मुझे यह नहीं मिला कि इससे बहुत मदद मिली। दूसरे शब्दों में, सामान्य रूप से रूबी विधियों जैसे 'times',' upto' आदि का उपयोग करके अपने फ़ंक्शन को अलग-अलग लिखें, जब तक कि आपको पता न हो कि लक्ष्य क्या है, मुझे नहीं लगता कि आप यह दावा कर सकते हैं। मैंने हास्केल में विधियों को लिखा है कि उस समय की कोई समस्या नहीं है और यह एक कठोर है। – iain