如何从python中的递归函数返回值?

How to return value from recursive function in python?

我正在使用Python中的二进制树。我需要创建一个方法来搜索树并返回可以插入新值的最佳节点。但是我很难从这个递归函数返回一个值。我是Python的新手。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def return_key(self, val, node):
    if(val < node.v):
        if(node.l != None):
            self.return_key(val, node.l)
        else:
            print node.v
            return node
    else:
        if(node.r != None):
            #print node.v
            self.return_key(val, node.r)
        else:
            print node.v
            return node

打印node.v打印节点值,但打印返回的节点时:

1
print ((tree.return_key(6, tree.getRoot().v)))

资讯科技印刷

None

结果。


您需要返回递归调用的结果。您在这里忽略了它:

1
2
if(node.l != None):
    self.return_key(val, node.l)

1
2
if(node.r != None):
    self.return_key(val, node.r)

递归调用与其他函数调用没有区别,如果有返回值,您仍然需要处理它。使用return语句:

1
2
3
4
5
6
7
if(node.l != None):
    return self.return_key(val, node.l)

# ...

if(node.r != None):
    return self.return_key(val, node.r)

请注意,由于None是一个单例值,您可以并且应该在这里使用is not None来测试是否存在:

1
2
3
4
5
6
7
if node.l is not None:
    return self.return_key(val, node.l)

# ...

if node.r is not None:
    return self.return_key(val, node.r)

不过,我怀疑您向要开始的调用传递了错误的参数;如果第二个参数是节点,则不要传递节点值:

1
print(tree.return_key(6, tree.getRoot())) # drop the .v

另外,如果您所有的node类都有相同的方法,那么您可以重复使用该方法,而不是使用self.return_value();在Tree上,只需执行以下操作:

1
print tree.return_key(6)

其中Tree.return_key()委托给根节点:

1
2
3
4
def return_key(self, val):
    root = tree.getRoot()
    if root is not None:
        return tree.getRoot().return_key(val)

Node.return_key()变为:

1
2
3
4
5
6
7
8
9
10
def return_key(self, val):
    if val < self.v:
        if self.l is not None:
            return self.l.return_key(val)
    elif val > self.v:
        if self.r is not None:
            return self.r.return_key(val)

    # val == self.v or child node is None
    return self

我在这里也更新了val测试逻辑;如果val < self.v(或代码中的val < node.v)是假的,不要假设val > self.v是真的;val可以是相等的。