रिकर्सिव फ़ंक्शंस लिखते समय एक बहुत आम शुरुआत गलती है कि उसी कार्य से पूरी तरह से अनावश्यक रिकर्सिव कॉल को गलती से बंद कर दिया जाए। उदाहरण के लिए, इस पुनरावर्ती क्रिया एक द्विआधारी पेड़ में अधिकतम मूल्य (नहीं एक द्विआधारी खोज वृक्ष) पता चलता है कि विचार करें:एक कार्यक्रम में अनावश्यक रिकर्सिव कॉल का पता लगाने के लिए एक उपकरण?
int BinaryTreeMax(Tree* root) {
if (root == null) return INT_MIN;
int maxValue = root->value;
if (maxValue < BinaryTreeMax(root->left))
maxValue = BinaryTreeMax(root->left); // (1)
if (maxValue < BinaryTreeMax(root->right))
maxValue = BinaryTreeMax(root->right); // (2)
return maxValue;
}
सूचना है कि यह कार्यक्रम संभावित लाइनों में BinaryTreeMax
करने के लिए दो पूरी तरह से बेमानी पुनरावर्ती कॉल करता है (1) और (2)। ताकि बस से पहले से मूल्य कैशिंग द्वारा इन अतिरिक्त कॉल के लिए कोई आवश्यकता नहीं है हम इस कोड को फिर से लिखने सकता है:
int BinaryTreeMax(Tree* root) {
if (root == null) return INT_MIN;
int maxValue = root->value;
int leftValue = BinaryTreeMax(root->left);
int rightValue = BinaryTreeMax(root->right);
if (maxValue < leftValue)
maxValue = leftValue;
if (maxValue < rightValue)
maxValue = rightValue;
return maxValue;
}
अब, हम हमेशा ठीक दो पुनरावर्ती कॉल करते हैं।
मेरा सवाल यह है कि क्या कोई ऐसा उपकरण है जो किसी प्रोग्राम का स्थिर या गतिशील विश्लेषण करता है (जो भी भाषा आप चाहते हैं; मैं बहुत पसंद नहीं करता!) यह पता लगा सकता है कि कोई प्रोग्राम पूरी तरह से अनावश्यक है या नहीं रिकर्सिव कॉल द्वारा "पूरी तरह से अनावश्यक" मेरा मतलब है कि
- पुनरावर्ती कॉल, इससे पहले कि बना दिया गया है पुनरावर्ती क्रिया का एक ही मंगलाचरण द्वारा
- (या उसके वंश में से एक), और
- कॉल ही नहीं है देखने योग्य साइड इफेक्ट्स।
यह कुछ ऐसा है आम तौर पर हाथ से निर्धारित किया जा सकता है, लेकिन मुझे लगता है कि यह बहुत अच्छा है, तो वहाँ कुछ उपकरण थे होगा कि स्वचालित रूप से छात्रों को कैसे सरल बनाने से बचने के बारे में प्रतिक्रिया हासिल की मदद करने का एक तरीका के रूप में इस तरह झंडा बातें कर सकते थे लेकिन उनके कार्यक्रमों में महंगे गलतियां जो बड़ी अक्षमताओं में योगदान दे सकती हैं।
क्या कोई इस तरह के उपकरण के बारे में जानता है?
मैं पूरी तरह से सहमत हैं कि यह सामान्य रूप में असंभव है का अर्थ पेड़ की पहुंच है। हालांकि मैं इस बात से सहमत हूं कि यहां एक और सामान्य प्रश्न है जो अधिकतर, किसी भी फ़ंक्शन कॉल पर विचार करता है, मुझे विशेष रूप से रिकर्सिव कॉल में रूचि है क्योंकि रिकर्सिव काम को डुप्लिकेट करने की लागत बहुत बड़ी हो सकती है (यही कारण है कि, उदाहरण के लिए, ज्ञापन और डीपी रनटाइम घटने पर इतना प्रभावी!) – templatetypedef
मुझे नहीं लगता कि यह एक सामान्य सवाल है, मुझे लगता है कि यह वही सवाल है। मैं कल्पना नहीं कर सकता कि कैसे रिकर्सिव कॉल का समाधान किसी अन्य फ़ंक्शन कॉल के लिए काम नहीं करेगा। – zmbq
और टाइपो सुधार के लिए धन्यवाद। – zmbq