In [ ]:
from IPython.display import display
from graphviz import Digraph

1. 生成子集¶

In [ ]:
def subsets(S):
    if not S:
        return [[]]
    else:
        x, sub = S[0], subsets(S[1:])
        return sub + [([x]+s) for s in sub]
In [ ]:
subsets(['a'])
Out[ ]:
[[], ['a']]
In [ ]:
subsets(['red', 'green', 'blue'])
Out[ ]:
[[],
 ['blue'],
 ['green'],
 ['green', 'blue'],
 ['red'],
 ['red', 'blue'],
 ['red', 'green'],
 ['red', 'green', 'blue']]
In [ ]:
subsets('1234')
Out[ ]:
[[],
 ['4'],
 ['3'],
 ['3', '4'],
 ['2'],
 ['2', '4'],
 ['2', '3'],
 ['2', '3', '4'],
 ['1'],
 ['1', '4'],
 ['1', '3'],
 ['1', '3', '4'],
 ['1', '2'],
 ['1', '2', '4'],
 ['1', '2', '3'],
 ['1', '2', '3', '4']]

2. 生成排列¶

In [ ]:
def permutations(S):
    if not S:
        return [[]]
    else:
        res, perms = [], permutations(S[1:])
        for i, _ in enumerate(S):
            for perm in perms:
                res.append(perm[:i] + [S[0]] + perm[i:])
        return res
In [ ]:
permutations('abc')
Out[ ]:
[['a', 'b', 'c'],
 ['a', 'c', 'b'],
 ['b', 'a', 'c'],
 ['c', 'a', 'b'],
 ['b', 'c', 'a'],
 ['c', 'b', 'a']]
In [ ]:
permutations([1, 2, 3, 4])
Out[ ]:
[[1, 2, 3, 4],
 [1, 2, 4, 3],
 [1, 3, 2, 4],
 [1, 4, 2, 3],
 [1, 3, 4, 2],
 [1, 4, 3, 2],
 [2, 1, 3, 4],
 [2, 1, 4, 3],
 [3, 1, 2, 4],
 [4, 1, 2, 3],
 [3, 1, 4, 2],
 [4, 1, 3, 2],
 [2, 3, 1, 4],
 [2, 4, 1, 3],
 [3, 2, 1, 4],
 [4, 2, 1, 3],
 [3, 4, 1, 2],
 [4, 3, 1, 2],
 [2, 3, 4, 1],
 [2, 4, 3, 1],
 [3, 2, 4, 1],
 [4, 2, 3, 1],
 [3, 4, 2, 1],
 [4, 3, 2, 1]]

3. 绘制表达式树¶

In [ ]:
class Node:
    def __init__(self, name, children=[]):
        self.name = name
        self.children = children

    def render(self, G):
        u = str(hash(self))
        G.node(u, label=str(self.name), shape='circle')
        for child in self.children:
            child.render(G)
            v = str(hash(child))
            G.edge(u, v)

def render(lines):
    for line in lines.strip().splitlines():
        G = Digraph()
        eval(line).render(G)
        display(G)

# C++ 代码的输出
render(
'''
Node(name='+',children=[Node(name=1),Node(name=2)])
Node(name='+',children=[Node(name='()',children=[Node(name='+',children=[Node(name=1),Node(name=2)])]),Node(name='()',children=[Node(name='+',children=[Node(name=3),Node(name='+',children=[Node(name=4),Node(name=5)])])])])
Node(name='+',children=[Node(name=4),Node(name='+',children=[Node(name='()',children=[Node(name='+',children=[Node(name='+',children=[Node(name=1),Node(name=2)]),Node(name=3)])]),Node(name='()',children=[Node(name='+',children=[Node(name=3),Node(name='+',children=[Node(name=4),Node(name=5)])])])])])
Node(name='+',children=[Node(name='+',children=[Node(name='+',children=[Node(name='+',children=[Node(name=1),Node(name=1)]),Node(name='+',children=[Node(name='+',children=[Node(name=3),Node(name=4)]),Node(name=5)])]),Node(name=1)]),Node(name=1)])
'''
)
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image