2011-05-09 15 views
5

मुझे पता है कि पायथन पूंछ-कॉल अनुकूलन का समर्थन नहीं करता है। क्या इसका अर्थ यह है कि एक पुनरावर्तक प्रक्रिया के साथ एक पुनरावर्ती प्रक्रिया है जैसे नीचे परिभाषित फैक्टोरियल ओ (एन) मेमोरी का उपभोग करेगा, या यह तथ्य यह है कि कोई स्थगित ऑपरेशन नहीं है, इसका मतलब है कि अंतरिक्ष ओ (1) होगा?क्या पाइथन स्टैक एक पुनरावर्तक प्रक्रिया द्वारा निष्पादित एक पुनरावर्तक प्रक्रिया के साथ बढ़ता है?

def factorial(n, accum=1): 
    if n == 0: 
     return accum 
    else: 
     return factorial(n-1, accum * n) 

उत्तर

5

स्मृति ओ (एन) होगी। अगर पायथन ने उस मामले को अनुकूलित किया है, तो रिकॉर्शन में गहराई से हुआ अपवाद एक पूर्ण स्टैक ट्रेस नहीं होगा। आप अपने लिए परीक्षण कर सकते हैं कि यह केवल बेस केस को अपवाद बढ़ाकर करता है, और आप पूर्ण स्टैक ट्रेस देखेंगे।

+0

i.e. बेस केस अपवाद चाल के लिए अपवाद ("परिणाम", accum) ' – laher

+0

+1 बढ़ाएं –

2

कोई पूंछ-कॉल अनुकूलन मतलब है कि आप पुनरावर्ती कॉल रिटर्न से पहले स्मृति में ढेर रखने की जरूरत है, इसलिए मुझे लगता है कि स्मृति के उपयोग हे (एन) इस मामले में किया जाएगा।

आप खुद ही इसे बाहर की जाँच करने के लिए, बस top में और स्मृति के उपयोग की जाँच (sys.setrecursionlimit के उपयोग के साथ) n के बड़े मूल्यों के लिए अपने उदाहरण कोड चलाने आप को समझाने चाहिए चाहते हैं कि इससे न हे (1)।

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