我在用python编写truthtable相关的作业时遇到了一些问题。我试着去上班时间,但他们什么都不知道,所以我得问问你们。
问题是:
--
在这个问题中,您将实现用于打印带有变量的公式的真值表的函数。您可以使用下面的helper函数,它将打印以制表符分隔的值列表。
def prints(values):
print("\t".join([str(value) for value in values]))
上述功能可以如下使用
prints([True, False, True])
True False True
您还可以使用以下helper函数,该函数返回函数的参数名列表:
def variables(f):
return list(f.__code__.co_varnames)
上述功能可以使用如下:
def h(x,y,z): return (y or x) and (not(z) <= x)
variables(h)
['x', 'y', 'z']
A:实现一个函数truthtablexy(f),它接受一个函数f作为输入(即,一个python函数对应于一个公式,如您在上面的问题2中定义的公式)。你可以假设f有两个布尔参数x和y。函数应该为f打印一个真值表。
def f(x,y): return x and y
truthtableXY(f)
y x formula
True True True
True False False
False True False
False False False
b:实现一个递归函数truthtable(f),它将单个函数f(即对应于公式的python函数)作为第一个参数。函数f可以接受任何非零数量的参数。函数应该为f打印一个真值表。
def h(x,y,z): return (y or x) and (not(z) <= x)
truthtable(h)
x y z formula
True True True False
True True False False
True False True False
True False False False
False True True True
False True False False
False False True False
False False False False
truthtable()函数应采用递归回溯方法,并可按如下方式组织:
函数应该有第二个默认值为[]的参数值,它将是函数建立并最终传递给f的值的列表;
如果列表值为空,则函数应打印包含所有变量名的行(每个变量一个列标题);
如果列表值的长度与f的变量列表的长度相同,则函数应打印一行值,其中包含值中的所有值,以及将f应用于该值列表的结果(使用*运算符将f应用于参数列表);
如果列表值短于f的变量列表,则函数应递归调用truthtable(),并适当更改truthtable()的参数。
C:实现一个函数行(f),它将一个函数f(即对应于公式的Python函数)作为第一个参数函数应该返回f的truth表中的行数。
def h(x,y,z): return (y or x) and (not(z) <= x)
rows(h)
8
--
我设法做了一个,得到了这个答案:
def truthtableXY(f):
prints(['y', 'x', 'formula'])
for x in [True, False]:
for y in [True, False]:
prints([x, y, f(x,y)])
这很管用。但我就是不知道怎么做其他的。
有人知道/能想出答案吗?
这是带家庭作业的原始网站btw:http://cs-people.bu.edu/lapets/131/m.php?#2.4(问题3)
提前谢谢你们!:)
最佳答案
对于B,你需要:
def truthtable(f, values=None):
if values is None:
prints(variables(f) + ["formula"])
values = []
# print values
if len(values) == len(variables(f)):
prints(values + [f(*values)])
else:
for b in [True, False]:
truthtable(f, values + [b])
如何满足您的规格:
函数应该有第二个参数
values
和默认值[]
的值,它将是函数建立的值列表并最终传递给
f
;-不完全是,“可变默认参数”在python中是一个错误的移动,但是我有values
并在第一次调用truthtable
时使其成为一个空列表。如果列表
values
为空,则函数应打印包含所有变量名的行(一列
每个变量的标题);-在初始化时完成
value
如果列表
values
与f
的变量列表,函数应打印一行值包含
values
中的所有值,以及将
f
应用于该值列表(使用*
-运算符将f
应用于参数列表);-第二个
if
块如果列表
values
比列表短对于
f
的变量,函数应递归调用truthtable()
,对truthtable()
-最后是for
循环。关于最后一部分的更多解释,您需要构建
True
和False
的组合以作为参数传递给f
,因此您递归地调用(即从自身调用函数)truthtable
,首先使用True
,然后使用False
,每次都添加到列表中,直到您拥有正确数量的参数取消注释print values
以观察在解释器中发生的这种情况。