递归循环没有预期的行为

时间:2018-12-21 02:33:54

标签: python recursion

所以我用python创建了一棵树。我正在尝试更改根节点的每个子节点的某些值。但是,我树中的每个节点都没有受到攻击。

class Node(object):
    def __init__(self, value, priority):
        self.parent = None
        self.children = []
        self.value = value
        self.priority = priority

    def add_child(self, obj):
        self.children.insert(obj)
        obj.parent = self

    def getChildren(self):
        return self.children.getAll()

tom = Node("DD",1)
tom.add_child(Node("a",0.3))
tom.add_child (Node("b", 0.6))

tom.getChildren()[0].add_child(Node("c",1))
tom.getChildren()[1].add_child(Node("d",1))
#print(tom.popHighestValue().value)

def getAll(currentNode):
    print(currentNode.value)
    if(currentNode.getChildren != []):
        for sibling in currentNode.getChildren():
            sibling.priority = 1
            return getAll(sibling)

树应该看起来像:

DD
/\
a  b
/
c  

但是只有DD-> a-> c被击中。我认为遍历DD-> c之后,将保存并继续for循环状态。

目标是击中树中的每个节点。并将优先级值设置为1。

2 个答案:

答案 0 :(得分:0)

return语句始终退出当前函数。如果执行此操作时处于循环中,则循环的其余部分将永远不会执行。

如果您需要返回所有递归调用的值,则需要在循环过程中将它们收集在一个列表中,然后在循环完成后返回该列表。

但是在这种情况下,您似乎不需要退货。此功能仅用于设置属性,没有提取任何内容。因此,只需进行递归调用就不会返回。

def getAll(currentNode):
    print(currentNode.value)
    for sibling in currentNode.getChildren():
        sibling.priority = 1
        getAll(sibling)

顺便说一句,这不会设置根节点的优先级,因为它只会设置子级的优先级。如果要包括根节点,则应为:

def getAll(currentNode):
    print(currentNode.value)
    currentNode.priority = 1
    for sibling in currentNode.getChildren():
        getAll(sibling)

此外,您不应在getAll()方法中调用getChildren()。它只会返回self.children,而不是self.children.getAll()

答案 1 :(得分:0)

如果您在调用getAll()之前删除了返回值,并将其放置在封闭的for循环之外,则可以解决您的问题。

在您的代码中,您无法处理所有子项,因为在第一次迭代后,您立即使用getAll()语句调用return。因此,除第一个兄弟姐妹外,其他所有兄弟姐妹都不会/不会在每个深度进行探索。