फ़ंक्शन कॉल को स्टैक पर धक्का देने के साथ प्रतिस्थापित करता है, और स्टैक को पॉप-अप करने के साथ लौटाता है, और आपने रिकर्सन को समाप्त कर दिया है।
संपादित करें: प्रतिक्रिया पुनरावर्ती एल्गोरिदम लगातार अंतरिक्ष में दिखाया जा सकता है "एक ढेर का उपयोग कर अंतरिक्ष की लागत में कमी नहीं करता" करने के लिए
में, यह एक पूंछ पुनरावर्ती ढंग से लिखा जा सकता है। यदि यह पूंछ-पुनरावर्ती प्रारूप में लिखा गया है, तो कोई भी सभ्य संकलक ढेर को ध्वस्त कर सकता है। हालांकि, इसका मतलब है कि "कन्वर्ट फ़ंक्शन कॉल को स्पष्ट स्टैक-पुश पर कॉल करता है" विधि भी स्थिर स्थान लेती है। एक उदाहरण के रूप में, चतुर लेते हैं।
भाज्य:
def fact_rec(n):
' Textbook Factorial function '
if n < 2: return 1
else: return n * f(n-1)
def f(n, product=1):
' Tail-recursive factorial function '
if n < 2: return product
else: return f(n-1, product*n)
def f(n):
' explicit stack -- otherwise same as tail-recursive function '
stack, product = [n], 1
while len(stack):
n = stack.pop()
if n < 2: pass
else:
stack.append(n-1)
product *= n
return product
क्योंकि stack.pop() पाश में stack.append() इस प्रकार है, ढेर उस में एक से अधिक आइटम है कभी नहीं, और इसलिए यह लगातार अंतरिक्ष को पूरा आवश्यकता। यदि आप 1-लंबाई के ढेर के बजाय एक अस्थायी चर का उपयोग करने की कल्पना करते हैं, तो यह आपके मानक पुनरावृत्त-फैक्टोरियल एल्गोरिदम बन जाता है।
बेशक, रिकर्सिव फ़ंक्शन हैं जिन्हें पूंछ-पुनरावर्ती प्रारूप में नहीं लिखा जा सकता है। आप अभी भी किसी प्रकार के ढेर के साथ पुनरावर्तक प्रारूप में परिवर्तित कर सकते हैं, लेकिन अगर अंतरिक्ष-जटिलता पर कोई गारंटी थी तो मुझे आश्चर्य होगा।
जो कि आप रिकर्सिव कहलाते हैं पर निर्भर करता है। प्रत्येक रिकर्सिव फ़ंक्शन को स्टैक को लागू करके गैर-रिकर्सिव में अनुवाद किया जा सकता है .. – yairchu
हां; इसे यहां विस्तार से वर्णित किया गया है: http://stackoverflow.com/questions/1094679/ –
@Marc Gravell: यह बिल्कुल बढ़िया है! –