【问题标题】:Finding a node in a tree在树中查找节点
【发布时间】:2013-08-05 10:27:03
【问题描述】:

我无法在具有任意分支因子的树中找到节点。每个节点都携带数据并且有零个或更多的子节点。搜索方法在 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 是否在调用该方法的节点中,然后检查所有该节点的子节点。我一直在无限循环,真的停留在这一点上,任何见解都将不胜感激。

【问题讨论】:

    标签: python recursion tree


    【解决方案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 行,这将再次调用相同的方法,并一直持续下去。

    【讨论】:

    • 但是,当我返回 self.find(x) + _level 时,下一次迭代将从 _level = [前一个节点的子节点] 开始,因此 [self] 将不存在并且第 5 行不会总是假的。
    • 也许问题是您在代码中使用_level 做事,而您打算使用self._level 做事?前者只是设置该方法调用的本地变量,并且在该方法递归调用自身时不存在,而后者在对象上设置值并将持续存在。但是,即使您进行了更改,函数的第一行也是_level = [self],因此您在使用它之前会覆盖任何内容。
    【解决方案2】:

    递归搜索的一个简单模式是使用生成器。这样可以很容易地将答案传递给调用代码,而无需自己管理递归的状态。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2013-01-17
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多