1。)我想确认我确实需要四个布尔变量来回答下面的问题,例如: p,q,x,y
2.)我需要编写一个递归函数来解析和解释它。
布尔声明:
(T| (F& (T|F))) where | = or, & = and
我认为这可以在下面用变量正确重述:
X Or ( Y And (P Or Q))
假设到目前为止我还可以,我想我可以使用Truth表Truth Table以某种方式构建我的递归函数。通过某种方式,打破问题 进入终止条件和减少步骤,其中函数每次调用自己的数字较小。
How can I build a recursive function in python?
https://www.youtube.com/watch?v=wMNrSM5RFMc< - Python Recursion深入解释
任何澄清将不胜感激!
答案 0 :(得分:1)
您建议的陈述((T| (F& (T|F))) where | = or, & = and
)可以简化为:T or (F and (T or F))
现在,正如@tobias_k所说,T
和F
可以是变量名称,也可以只是True
和False
的缩写。
变量名称:
T or (F and (T or F)) == T or F
True
和False
:
True or (False and (True or False))
True or (False and True)
True or False
True
您认为它们是4个不同的变量:X
,Y
,P
和Q
。 X or (Y and (P or Q))
是一个有效的Python表达式,将根据True
,False
,X
和{{1}评估为Y
或P
}值。没有递归申请。即使你想获得完整的真值表,你也不需要任何递归。
以下函数接受一个dict作为参数,其键用作列名,其值是将使用所有imputs调用的函数,必须返回一个布尔值,第二个参数包含输入变量的名称。
Q
然后你会打电话给它:
import itertools
def truth_table(f, field_names):
outputs = list(f.keys())
cols = list(field_names) + outputs
format = ""
separator = ""
for width in (len(name) + 2 if len(name) > 5 else 7 for name in cols):
format += "{!s:^" + str(width) + "}|"
separator += ("-" * width) + "+"
format = format[:-1]
separator = separator[:-1]
print(format.format(*cols))
print(separator)
for case in itertools.product((False, True), repeat=len(field_names)):
row = list(case)
for output in outputs:
row.append(f[output](*case))
print(format.format(*row))
将输出:
truth_table(
{
"P or Q": lambda x, y, p, q: p or q,
"Y and (P or Q)": lambda x, y, p, q: y and (p or q),
"X or (Y and (P or Q))": lambda x, y, p, q: x or (y and (p or q)),
},
("X", "Y", "P", "Q")
)