2017-08-28 13 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 

私は次のようにしたいと思いますが、明らかに機能しません。それは再帰で終了条件の1

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

あるので、

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

しかし私は、ノードがNone場合、ノードには、rootを割り当てる別のトリックを使用することはできませんこのような状況を処理するための任意の推奨方法はありますか?

+0

私はヘルパーメソッドを使用すると、すでにそれについて移動するための最もエレガントな方法だと思います。 tree-heightメソッドをパブリックAPIの一部にしたい場合は、 'height_tree'と' height'の代わりに 'height'と' _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