सामान्य तौर पर, एक प्रत्यावर्तन कॉल की एक पेड़, जड़ मूल कॉल किया जा रहा है, और पत्तियों कॉल कि recurse नहीं है किया जा रहा है बनाता है।
एक अपमानजनक मामला तब होता है जब प्रत्येक कॉल केवल एक अन्य कॉल करता है, इस मामले में पेड़ एक साधारण सूची में खराब हो जाता है। पुनरावृत्ति में परिवर्तन तब एक स्टैक का उपयोग करके हासिल किया जाता है, जैसा कि @ जेरेम्याह द्वारा दिखाया गया है।
अधिक सामान्य मामले में, यहां, जब प्रत्येक कॉल एक कॉल से अधिक (कड़ाई से) प्रदर्शन करती है। आप एक असली पेड़ प्राप्त करते हैं, और इसलिए, इसे पार करने के कई तरीके हैं।
यदि आप एक स्टैक के बजाय कतार का उपयोग करते हैं, तो आप एक चौड़ाई-पहले ट्रैवर्सल कर रहे हैं। @Jeremiah ने एक ट्रैवर्सल प्रस्तुत किया जिसके लिए मुझे कोई नाम नहीं पता। सामान्य "रिकर्सन" ऑर्डर आमतौर पर एक गहराई-पहला ट्रैवर्सल होता है।
ठेठ प्रत्यावर्तन का मुख्य लाभ यह है कि ढेर की लंबाई के रूप में ज्यादा बढ़ने नहीं है, तो आप सामान्य रूप में के लिए लक्ष्य रखना चाहिए गहराई-प्रथम ... अगर जटिलता पराजित नहीं करता है आप :)
मैं एक वृक्ष के पहले ट्रैवर्सल को गहराई से लिखने की शुरुआत करता हूं, एक बार यह आपके एल्गोरिदम को अपनाने के बाद काफी सरल होना चाहिए।
संपादित करें:
class Node:
def __init__(self, el, children):
self.element = el
self.children = children
def __repr__(self):
return 'Node(' + str(self.element) + ', ' + str(self.children) + ')'
def depthFirstRec(node):
print node.element
for c in node.children: depthFirstRec(c)
def depthFirstIter(node):
stack = [([node,], 0), ]
while stack != []:
children, index = stack.pop()
if index >= len(children): continue
node = children[index]
print node.element
stack.append((children, index+1))
stack.append((node.children, 0))
ध्यान दें कि ढेर प्रबंधन थोड़ा के सूचकांक को याद करने की जरूरत के कारण जटिल है: के बाद से मैं कुछ समय के लिए किया था, मैं अजगर पेड़ Traversal लिखा था, यह विहित उदाहरण है बच्चा वर्तमान में हम जा रहे थे।
और गहराई-पहले के आदेश निम्नलिखित कलन विधि के अनुकूलन:
def generateBrackets(c):
# stack is a list of pairs children/index
stack = [([(c,c,''),], 0), ]
while stack != []:
children, index = stack.pop()
if index >= len(children): continue # no more child to visit at this level
stack.append((children, index+1)) # register next child at this level
l, r, current = children[index]
if r == 0 and l == 0: print current
# create the list of children of this node
# (bypass if we are already unbalanced)
if l > r: continue
newChildren = []
if l != 0: newChildren.append((l-1, r, current + '<'))
if r != 0: newChildren.append((l, r-1, current + '>'))
stack.append((newChildren, 0))
मैं सिर्फ महसूस किया कि सूचकांक भंडारण एक सा "भी" जटिल है, के बाद से मैं वापस जाएँ कभी नहीं। इस प्रकार सरल समाधान सूची तत्वों को हटाने में शामिल होता है जिन्हें मुझे अब आवश्यकता नहीं है, सूची को कतार के रूप में देखते हुए (वास्तव में, एक ढेर पर्याप्त हो सकता है)!
यह न्यूनतम परिवर्तन के साथ लागू होता है।
def generateBrackets2(c):
# stack is a list of queues of children
stack = [[(c,c,''),], ]
while stack != []:
children = stack.pop()
if children == []: continue # no more child to visit at this level
stack.append(children[1:]) # register next child at this level
l, r, current = children[0]
if r == 0 and l == 0: print current
# create the list of children of this node
# (bypass if we are already unbalanced)
if l > r: continue
newChildren = []
if l != 0: newChildren.append((l-1, r, current + '<'))
if r != 0: newChildren.append((l, r-1, current + '>'))
stack.append(newChildren)
एकरमेन को हर दूसरे रिकर्सिव फ़ंक्शन की तरह एक पुनरावर्तक संरचना में परिवर्तित किया जा सकता है, यह मानते हुए कि आप एक ट्यूरिंग-पूर्ण भाषा में काम कर रहे हैं। –
आप गतिशील प्रोग्रामिंग का उपयोग कर ऐसे एल्गोरिदम प्राप्त कर सकते हैं। यह नहीं पता कि इसे पायथन में कैसे कार्यान्वित किया जाए, इसलिए यदि आप सी शैली संस्करण में रूचि रखते हैं, तो मुझे बताएं और मैं कुछ कोड पोस्ट करूंगा। ब्रैकेट्स की एन जोड़ी के सभी संभावित संयोजन, मूल रूप से एन नोड्स के साथ संभावित संभव बाइनरी पेड़ हैं। उन सभी पेड़ों को बनाने के लिए, आप पहले 0..एन -1 नोड्स के साथ सभी संभावित पेड़ों को बनाने में सक्षम होना चाहिए, और उसके बाद उन पेड़ों में से एक को एक्स नोड्स (जहां एक्स 0..एन -1 के बीच है) और एक और पेड़ वाई नोड्स के साथ (जहां वाई एन -1-एक्स के बराबर है) और उन्हें एक सामान्य रूट जोड़ें। – Fede
उत्तर के लिए सभी को धन्यवाद - सभी बहुत उपयोगी थे और सबसे कठिन हिस्सा "एक" सही उत्तर चुनना है। मैं @ टेंगेंटस्टॉर्म के जवाब के साथ जा रहा हूं क्योंकि यह समझने के लिए यह सबसे आसान "पुनरावृत्ति" संस्करण था। – AlgoLearner