मैंने हाल ही में पाइथन सीखना शुरू किया और मैं 1000 गहरी रिकर्सन सीमा (डिफ़ॉल्ट रूप से) खोजने के लिए आश्चर्यचकित था। यदि आप इसे 30000 के बराबर पर्याप्त सेट करते हैं, तो यह सी की तरह सेगमेंटेशन गलती के साथ दुर्घटनाग्रस्त हो जाता है। हालांकि, सी काफी अधिक है।आपकी पसंदीदा भाषा गहरी रिकर्सन कैसे संभालती है?
(अजगर लोगों को बताते हैं कि आप हमेशा पुनरावृत्ति वालों के लिए पुनरावर्ती कार्यों में बदल सकते हैं और है कि वे हमेशा के लिए तेजी से कर रहे हैं जल्दी कर रहे हैं। यही कारण है कि 100% सच है। यह वास्तव में क्या मेरे सवाल यद्यपि के बारे में है नहीं है।)
मैंने पर्ल में एक ही प्रयोग की कोशिश की और लगभग 10 मिलियन रिकर्सन ने अपने सभी 4 गीगा रैम का उपभोग किया और मैंने कोशिश करने के लिए^सी का उपयोग किया। स्पष्ट रूप से पर्ल सी स्टैक का उपयोग नहीं करता है, लेकिन जब यह रिकर्स करता है तो यह हास्यास्पद मात्रा में स्मृति का उपयोग करता है - इस बात पर विचार करते हुए कि यह कॉल करने के लिए कितना काम करना है, इस पर बहुत चौंकाने वाला नहीं है।
मैंने पाइक में कोशिश की और लगभग 2 सेकंड में 100,000,000 रिकर्सन प्राप्त करने के लिए पूरी तरह से हैरान था। मुझे नहीं पता कि यह कैसे किया गया, लेकिन मुझे संदेह है कि यह पुनरावृत्ति को पुनरावृत्ति प्रक्रिया में फटकार कर रहा है - ऐसा लगता है कि यह कोई अतिरिक्त स्मृति का उपभोग नहीं करता है। [नोट: पाईक तुच्छ मामलों समतल करता है, लेकिन और अधिक जटिल वालों पर segfaults, या तो मुझे बताया गया हूँ।]
मैं इन अन्यथा बेकार कार्यों के लिए इस्तेमाल किया:
int f(int i, int l) { if(i<l) return f(i+1,l); return i; }
sub f { return f($_[0]+1, $_[1]) if $_[0]<$_[1]; return $_[0] };
def f(i,l):
if i<l:
return f(i+1,l)
return i
मैं बहुत उत्सुक कैसे अन्य भाषाओं (उदाहरण के लिए, PHP, रूबी, जावा, लुआ, ओकम्ल, हास्केल) रिकर्सन को संभालते हैं और वे इसे इस तरह क्यों संभालते हैं। इसके अतिरिक्त, कृपया ध्यान दें कि क्या फ़ंक्शन "पूंछ-रिकर्सिव" है (टिप्पणी देखें)।
Fatal error: Maximum function nesting level of '100' reached, aborting!
संपादित करें:: इससे पहले कि यह मर जाता है
आपका उदाहरण पूंछ-पुनरावर्ती है, इसलिए पूंछ-पुनरावर्तन का समर्थन करने वाला कोई भी भाषा कार्यान्वयन प्रभावी रूप से रिकर्सिव कॉल को "गोटो" में बदल देगा। – mfx