# recursion.py -- 2分木を扱う再帰関数の例
from collections import namedtuple
# 2分木のデータ構造(節の生成)
Node = namedtuple('Node', ['node', 'left', 'right'])
def Leaf(c):
"""2分木の葉の生成"""
return Node(c, None, None)
def show(t):
"""木を表す文字列"""
if t is None: return '#'
else: return t.node + '(' + show(t.left) + ',' + show(t.right) + ')'
def size(t):
"""木の大きさ(節の総数)を再帰的に計算"""
if t is None: return 0
else: return size(t.left) + size(t.right) + 1
def display(t, d=0):
"""木の大きさの再帰計算の様子を表示"""
# 関数の開始直後,節情報を表示
print('> '*d, end='')
if t is None: print('#')
else: print(repr(t.node))
# 節数の計算本体
if t is None: size = 0
else: size = display(t.left, d+1) + display(t.right, d+1) + 1
# 関数の終了直前,部分木の大きさを表示
print('> '*d, end='')
print(f'size = {size}')
return size
# 木を表す文字列,木の節数,節数の再帰計算の過程 を順に表示
if __name__ == '__main__':
t = Node('+', # 算術式 a*b + c/d を表す木
Node('*', Leaf('a'), Leaf('b')),
Node('/', Leaf('c'), Leaf('d'))
)
print(f't = {show(t)}')
print(f'size(t) = {size(t)}')
print('computation of size(t) :'); display(t)