evi*_*ead 17 python logic truthtable
我的问题很简单:"如何以优雅的方式在python中构建一个动态增长的真值表?"
对于n = 3
for p in False, True:
for q in False, True:
for r in False, True:
print '|{0} | {1} | {2} |'.format(int(p),int(q), int(r))
Run Code Online (Sandbox Code Playgroud)
对于n = 4
for p in False, True:
for q in False, True:
for r in False, True:
for s in False, True:
print '|{0} | {1} | {2} | {3}'.format(int(p),int(q), int(r), int(s))
Run Code Online (Sandbox Code Playgroud)
我想有一个函数,它将n作为参数并构建表,没有必要打印表,返回表示表的数据结构也很好.
Sve*_*ach 37
table = list(itertools.product([False, True], repeat=n))
Run Code Online (Sandbox Code Playgroud)
结果n = 3:
[(False, False, False),
(False, False, True),
(False, True, False),
(False, True, True),
(True, False, False),
(True, False, True),
(True, True, False),
(True, True, True)]
Run Code Online (Sandbox Code Playgroud)
itertools正如大家所指出的那样,真的是要走的路.但是如果你真的想看到这个算法所需的细节,你应该查找递归下降.以下是它在您的情况下的工作方式:
def tablize(n, truths=[]):
if not n:
print truths
else:
for i in [True, False]:
tablize(n-1, truths+[i])
Run Code Online (Sandbox Code Playgroud)
经过测试,工作
希望这可以帮助
列表理解当然更像是Pythonic.
def truthtable (n):
if n < 1:
return [[]]
subtable = truthtable(n-1)
return [ row + [v] for row in subtable for v in [0,1] ]
Run Code Online (Sandbox Code Playgroud)
结果,缩写为clairity:
truthtable(1)
[ [0],
[1] ]
truthtable(3)
[ [0, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 1],
[1, 0, 0],
[1, 0, 1],
[1, 1, 0],
[1, 1, 1] ]
Run Code Online (Sandbox Code Playgroud)
作为生成器功能yield:
def truthtable (n):
if n < 1:
yield []
return
subtable = truthtable(n-1)
for row in subtable:
for v in [0,1]:
yield row + [v]
Run Code Online (Sandbox Code Playgroud)
另外,简单地将返回值从数组解析更改为生成器表达式,使得返回类型等同于yield版本的生成器函数:
def truthtable (n):
if n < 1:
return [[]]
subtable = truthtable(n-1)
return ( row + [v] for row in subtable for v in [0,1] )
Run Code Online (Sandbox Code Playgroud)