我在使用任意分支因子在树中查找节点时遇到问题。每个节点都携带数据,并且有零个或多个子节点。搜索方法在Node类中 检查该节点是否携带数据,然后检查所有节点子节点。在我的递归方法中,我总是以无限循环结束,任何帮助?
def find(self, x):
_level = [self]
_nextlevel = []
if _level == []:
return None
else:
for node in _level:
if node.data is x:
return node
_nextlevel += node.children
_level = _nextlevel
return self.find(x) + _level
find方法在Node类中,检查数据x是否在调用方法的节点中,然后检查所有节点的子节点。我不断得到一个无限循环,真的坚持到这一点,任何见解都会受到赞赏。
答案 0 :(得分:1)
此代码存在一些问题。首先,请注意第2行您有_level = [self]
。这意味着第5行的if _level == []
将始终为false。
第二个问题是,for
循环会覆盖_level
中的所有内容,但如上所述,由于第2行,该循环始终为[self]
。
第三个问题是return语句。你有return self.find(x) + _level
。这将分为两部分进行评估。首先,调用self.find(x)
,然后将返回的内容与_level
的内容连接起来。但是,当你调用self.find(x)
时,它将使用相同的参数调用相同的方法,然后依次命中相同的return self.find(x) + _level
行,这将再次调用相同的方法,然后依次调用永远。
答案 1 :(得分:1)
递归搜索的简单模式是使用生成器。这使得调用代码的答案很容易,而无需自己管理递归状态。
class Example(object):
def __init__(self, datum, *children):
self.Children = list(children) # < assumed to be of the same or duck-similar class
self.Datum = datum
def GetChildren(self):
for item in self.Children:
for subitem in item.GetChildren():
yield subitem
yield item
def FindInChildren(self, query): # where query is an expression that is true for desired data
for item in self.GetChildren():
if query(item):
yield item