2011-08-16 17 views
13

मैं एक सवाल के बारे में sys.setrecursionlimit()अजगर अधिकतम प्रत्यावर्तन, sys.setrecursionlimit के बारे में प्रश्न()

अजगर दस्तावेज़ से यह समारोह:

अजगर दुभाषिया की अधिकतम गहराई सेट करें सीमित करने के लिए ढेर। यह सीमा सी स्टैक के ओवरफ्लो और पायथन को दुर्घटनाग्रस्त होने से अनंत रिकर्सन को रोकती है। उच्चतम संभव सीमा मंच-निर्भर है। जब उपयोगकर्ता के पास एक प्रोग्राम होता है जिसके लिए गहरी रिकर्सन और एक प्लेटफॉर्म जो उच्च सीमा का समर्थन करता है, तो उपयोगकर्ता को सीमा अधिक निर्धारित करने की आवश्यकता हो सकती है। यह देखभाल के साथ किया जाना चाहिए, क्योंकि बहुत अधिक सीमा एक दुर्घटना का कारण बन सकती है।

यहाँ मेरी सवाल यह है:

def rec(N): 
    if N==0: 
     return 1 
    else: 
     return rec(N-1); 

अब के 100 करने के लिए अधिकतम प्रत्यावर्तन सेट कर सकते हैं:

के इस बेकार पुनरावर्ती क्रिया करते हैं अगर मैं rec(99) कोशिश

sys.setrecursionlimit(100) 

(100 रिकर्सिव कॉल), मुझे मिलता है:

RuntimeError: maximum recursion depth exceeded 

रिक (99) की गणना करने के लिए मुझे 105

पर रिकर्सन सीमा सेट करने की आवश्यकता है ऐसा क्यों है?

उत्तर

13

यह खराब नाम है। यह स्टैक गहराई कहना चाहिए, रिकर्सन गहराई नहीं। रिकर्सन का तात्पर्य है कि यह वही धागा है जो बार-बार सीमित है। हकीकत में, आपके पास वास्तविक कोड हो सकता है जिसने केवल 100 गहरे कॉल किए हैं। मैं इसकी सिफारिश नहीं करता, लेकिन आप कर सकते थे। वे इसके साथ दूर हो सकते हैं क्योंकि व्यावहारिक दुनिया में, आप कभी भी इस परिदृश्य में भाग लेने के साथ ही रिकर्सन के साथ हैं। जब आप इस वजह से दुर्घटनाग्रस्त हो जाते हैं, तो "रिकर्सन" शब्द देखकर आपको "स्टैक" के विरोध में क्या देखना है इसका तत्काल संकेत मिलता है।

(ढेर किसी भी सभ्य प्रोग्रामर को एक ही सुराग देना चाहिए, लेकिन चलो ईमानदार हो, आपका कोड बस दुर्घटनाग्रस्त हो गया है और आप एक प्रासंगिक त्रुटि संदेश चाहते हैं, है ना? 99.9 99 99% समय यह आपको बताता है कि आपने क्या गड़बड़ की है (आप चूक गए रिकर्सन के लिए आपका बेस केस।))

+0

Thx, मुझे लगता है कि मुझे परिभाषा को अधिक सावधानीपूर्वक पढ़ना चाहिए और फ़ंक्शन के नाम को नहीं देखना चाहिए –

4

अभी भी फ़ंक्शन कॉल हैं कि पायथन रनटाइम को आपके फ़ंक्शन तक पहुंचने की आवश्यकता है।

4

यह कुल स्टैक गहराई पर आधारित है और वास्तव में किसी विशेष एकल फ़ंक्शन की गहराई पर आधारित नहीं है। जब आप रिक() को पहली कॉल करते हैं तो आप शायद पहले से ही 5 की स्टैक गहराई पर हैं।

उदाहरण के लिए 5 रिकर्सिव फ़ंक्शन लें। प्रत्येक पिछली बार रिकर्सिव फ़ंक्शन के साथ अंतिम बार 98 रिकर्सिव कॉल करता है। 100 की रिकर्सन सीमा के साथ क्या आप वाकई प्रत्येक रिकर्सिव फ़ंक्शन को ~ 500 कॉल की कुल गहराई के लिए 99 कॉल करने की अनुमति देना चाहते हैं? नहीं, यह उन गहराई पर दुभाषिया को दुर्घटनाग्रस्त कर सकता है।

इसलिए रिकर्सन सीमा वैश्विक स्तर पर सभी कार्यों की अधिकतम गहराई है, कोई भी नामित फ़ंक्शन नहीं।

संबंधित मुद्दे