Code Complete 2 से हवाला देते हुए,रिकर्सन रन-टाइम मेमोरी का अप्रत्याशित उपयोग कैसे करता है?
int Factorial(int number) { if (number == 1) { return 1; } else { return number * Factorial(number - 1); } }
इसके अलावा धीमी[1] और रन-टाइम स्मृति का इस्तेमाल कर रही अप्रत्याशित[2], पुनरावर्ती संस्करण होने के इस दिनचर्या के को पुनरावृत्त संस्करण, से समझने के लिए कठिन है जो निम्नानुसार है:
int Factorial(int number) { int intermediateResult = 1; for (int factor = 2; factor <= number; factor++) { intermediateResult = intermediateResult * factor; } return intermediateResult; }
मुझे लगता है कि धीमा हिस्सा अनावश्यक फ़ंक्शन कॉल ओवरहेड्स की वजह से है।
लेकिन रिकर्सन रन-टाइम मेमोरी का उपयोग अप्रत्याशित कैसे करता है?
क्या हम हमेशा यह अनुमान नहीं लगा सकते कि कितनी मेमोरी की आवश्यकता होगी (जैसा कि हम जानते हैं कि रिकर्सन कब खत्म होना चाहिए)? मुझे लगता है कि यह पुनरावृत्ति के मामले के रूप में अप्रत्याशित होगा, लेकिन अब और नहीं।
ध्यान दें कि पुनरावृत्ति निरंतर समय में चल सकती है अगर प्रक्रिया पूंछ-रिकर्सन का उपयोग करती है और यदि भाषा पूंछ-कॉल अनुकूलन का समर्थन करती है। यदि आप रुचि रखते हैं तो "पूंछ-रिकर्सन" देखें। – erjiang
इसके अलावा, कुछ सीपीयू जैसे स्पार्क फ़ंक्शन कॉल ओवरहेड बहुत कम है। और टीसीएल जैसे कुछ प्रोग्रामिंग लेन-देन के साथ, फ़ंक्शन कॉल वास्तव में इनलाइन कोड की तुलना में तेज़ है (बाइटकंपलर कैसे काम करता है)। – slebetman