python的递归类方法中的默认参数

时间:2017-08-28 22:00:11

标签: python recursion parameter-passing

在递归类函数中,如何使用类成员作为默认参数?

我目前正在使用以下代码片段(python 3)。 height 是递归类函数。我想用于 node 的默认参数是 self._root 。为了实现这一点,我做了类似跟随的事情,但这是一个非常圆的方式,我必须定义另一个函数 height_tree 。有更直接的方法吗?

# following code works #  

class BTree: 

    def __init__(self, node=None):
        self._root = node

    def height_tree(self):
        return self.height(self._root)

    def height(self, node):
        if node is not None:
            height = max(self.height(node.get_left()), self.height(node.get_right())) + 1
        else:
            height = 0
        return height 

我想做类似以下的事情,但它显然不起作用!

def height(self, node=self._root)
   # code from above follows

但是,当节点为None时,我不能使用将root分配给节点的替代技巧,因为这是递归中的结束条件之一

def height(self, node)
    if node is None:
       node = self._root
    # this will conflict with logic in code block above#

有没有推荐的方法来处理这种情况?

2 个答案:

答案 0 :(得分:0)

您可以使用哨兵对象:

button2_Click()

由于此类对象具有唯一的内存地址,因此它永远不会与任何其他对象(包括sentinel = object() def height(self, node=sentinel) if node is sentinel: node = self._root ... )相同。

答案 1 :(得分:0)

您始终可以创建任意哨兵:

SENTINEL = object()

class BTree: 

    def __init__(self, node=None):
        self._root = node

    def height_tree(self):
        return self.height(self._root)

    def height(self, node=SENTINEL):
        if node is SENTINEL:
            node = self._root
        elif node is not None:
            height = max(self.height(node.get_left()), self.height(node.get_right())) + 1
        else:
            height = 0
        return height