2017-08-28 43 views
0

在遞歸類函數中,我如何使用類成員作爲默認參數?python的遞歸類方法中的默認參數

我目前正在使用以下代碼段工作(python 3)。 高度是遞歸類函數。我想用於節點的默認參數是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 

我卻無法使用分配根節點時節點是無自認爲是在遞歸結束條件

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

是否有任何建議的方式來處理這種情況的一個備用把戲?

+0

我會說使用一個輔助方法已經是最優雅的方式去了解它。如果只希望樹高度方法成爲公共API的一部分,您可以調用方法'height'和'_height'而不是'height_tree'和'height',但除了命名之外,我認爲這已經很好了。 – user2357112

+0

@ user2357112:謝謝你的回覆。很有幫助。 – toing

回答

0

可以使用定點對象:

sentinel = object() 

def height(self, node=sentinel) 
    if node is sentinel: 
     node = self._root 
    ... 

因爲這樣的對象有一個唯一的內存地址,它永遠不會是相同的任何其他對象(包括None)。

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