布尔解释和递归函数

时间:2018-01-29 14:53:57

标签: python recursion boolean

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深入解释

任何澄清将不胜感激!

1 个答案:

答案 0 :(得分:1)

您建议的陈述((T| (F& (T|F))) where | = or, & = and)可以简化为:T or (F and (T or F))

现在,正如@tobias_k所说,TF可以是变量名称,也可以只是TrueFalse的缩写。

变量名称:

T or (F and (T or F)) == T or F

TrueFalse

的撤消
True or (False and (True or False))
True or (False and True)
True or False
True

您认为它们是4个不同的变量:XYPQX or (Y and (P or Q))是一个有效的Python表达式,将根据TrueFalseX和{{1}评估为YP }值。没有递归申请。即使你想获得完整的真值表,你也不需要任何递归。

以下函数接受一个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")
)