2010-12-22 15 views
33

क्या कोई नियंत्रण है कि आप कुछ रिकॉर्ड कर सकते हैं?सी # रिकर्सन गहराई - आप कितनी गहरी जा सकते हैं

एक बुनियादी परीक्षण कार्यक्रम मैं 18 k सिर्फ

जो stacksize पर निर्भर करता है की एक प्रत्यावर्तन गहराई मिल से ....

वहाँ (एक धागा स्मृति का एक हिस्सा स्थापित करने के लिए शायद एक तरीका है) रिकर्सन गहराई को बढ़ाने के लिए एक बड़े पैमाने पर ढेर के साथ?

+0

संभावित डुप्लिकेट [आप प्रबंधित निष्पादन योग्य.net के लिए डिफ़ॉल्ट स्टैक आकार कैसे बदलते हैं] (http://stackoverflow.com/questions/1042345/how-do-you-change-default-stack-size-for-managed -उत्पादनीय-नेट) –

+1

असीम रूप से गहरा। या कम से कम पूंछ कॉल का समर्थन करने वाली भाषाओं में। – Juliet

+6

<प्राप्ति रेफरी> 3 स्तर गहरे ...

उत्तर

40

मैंने कुछ दस्तावेज़ पहचान के दौरान स्टैक आकार में वृद्धि की है। यह वास्तव में जरूरी था।

तो तुम निम्नलिखित कोड का उपयोग कर थ्रेड के लिए ढेर आकार में वृद्धि कर सकते हैं:

var stackSize = 10000000; 
Thread thread = new Thread(new ThreadStart(BigRecursion), stackSize); 

थ्रेड (ThreadStart, Int32) - थ्रेड वर्ग का एक नया उदाहरण आरंभीकृत, अधिकतम ढेर आकार को निर्दिष्ट धागे के लिए।

Source

आशा इस आपको क्या चाहिए।

+9

मुझे सच में संदेह है कि किसी को भी इसकी जरूरत है। आपको बस इस तरह का कोड नहीं बनाना चाहिए, मैं कोशिश करने वाले प्रोग्रामर को बर्खास्त कर दूंगा। किसी भी रिकर्सिव एल्गोरिदम को रिकर्सन के बिना लागू किया जा सकता है और कभी-कभी इसे उन तरीकों से कार्यान्वित किया जा सकता है जो किसी परिमाण से समस्या के क्रम को कम कर देते हैं। यह एक इंजन को ठीक करने के लिए स्लेज हथौड़ा का उपयोग कर एक कार मैकेनिक की तरह है। – Mick

+0

@ मिक, क्या होगा यदि रिकर्सन का उपयोग करने वाला कोड आपके नियंत्रण से बाहर है? उदाहरण के लिए, आप एक तृतीय-पक्ष लाइब्रेरी का उपयोग कर सकते हैं जो रिकर्सन का उपयोग करता है। – Sam

+8

मुझे चौथी पार्टी मिल जाएगी;) – Mick

5

डिफ़ॉल्ट स्टैक आकार पीई हेडर में संग्रहीत किया जाता है।

यदि आप स्वयं धागे को फेंकते हैं, तो थ्रेड में एक कन्स्ट्रक्टर होता है जो ढेर आकार को पैरामीटर के रूप में लेता है।

हालांकि, 1 एमबी का डिफ़ॉल्ट .NET स्टैक आकार अधिकांश कार्यों के लिए पर्याप्त होना चाहिए, इसलिए इससे पहले कि आप इसे बदल दें, आपको कम से कम कार्य की समीक्षा करनी चाहिए।

16

मुझे लगता है कि आप यहां समस्याएं खतरा कर रहे हैं। यह निर्धारित करना मुश्किल है कि एक रिकर्सिव एल्गोरिदम कितना ढेर करेगा। और, यदि आप उस बिंदु पर हैं जहां पर्याप्त सवाल होगा तो पर्याप्त प्रश्न होगा, तो मैं एक और दृष्टिकोण की तलाश करूंगा।

अधिकतर रिकर्सिव एल्गोरिदम को रिकर्सिव नहीं होने के लिए फिर से लिखा जा सकता है। इसके बाद आप जितनी मेमोरी आवंटित कर सकते हैं उतनी मेमोरी आवंटित कर सकते हैं और पर्याप्त नहीं होने पर भी शानदार तरीके से ठीक हो सकते हैं।

+16

+1 प्रत्येक रिकर्सिव एल्गोरिदम को लूप और स्टैक डेटा स्ट्रक्चर के साथ गैर रिकर्सिव के रूप में लिखा जा सकता है। –

+6

@ बाय्रॉन: कॉलेज में मेरी डेटा संरचना कक्षा को याद रखने के लिए धन्यवाद। प्रोफेसर: "इस पेड़-ट्रैवर्सल प्रोग्राम को एक गैर-पुनरावर्ती प्रारूप में लिखें।" Me: "तुम हमसे नफरत क्यों करते हो?" :) –

+4

मेरा सवाल यह था कि यह कैसे करना है, मैं वास्तव में इसे करने की इच्छा से अधिक उत्सुक था। हालांकि यह अच्छी सलाह है, यह सवाल के जवाब में जवाब नहीं देता है। –

2

भले ही आप अधिक रिकर्सन गहराई प्राप्त करते हैं, केवल प्रदर्शन कारणों से मैं इस एल्गोरिदम को बिना रिकर्सन के कार्यान्वित करता हूं। विधि कॉल थोड़ी देर के भीतर पुनरावृत्तियों की तुलना में अधिक महंगा है। मैं दृढ़ता से कुछ भी लागू करने के खिलाफ सलाह देता हूं जिसके लिए डिफ़ॉल्ट स्टैक आकार के साथ झुकाव की आवश्यकता होती है।

मैं कभी-कभी रिकर्सन का उपयोग करता हूं, लेकिन केवल जब कॉल गहराई परिभाषित और कम होती है (100 से कम में)। व्यावसायिक सॉफ़्टवेयर बनाते समय, पुनरावर्ती एल्गोरिदम का उपयोग करते हुए जिनके पास अनिश्चितता की अनिश्चित संख्या है, पूरी तरह से व्यावसायिक नहीं है और आपको बहुत गुस्से में ग्राहकों को देने की संभावना है।

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