我已经在练习中挣扎了几个小时,所以我正在寻求帮助。
我必须重写此函数:
def is_in(eq,e,E):
""" (alpha*alpha -> bool) * alpha * list[alpha] -> bool
Return True if e is equal to one element of E according to eq"""
if len(E)==0:
return False
elif eq(e,E[0]):
return True
else:
return is_in(eq,e,E[1:])
is_in
验证元素是否在集合中(由列表表示)。问题是,两个元素可以是“相同的”,但是运算符==
将返回false(例如,我们认为[0,1]和[1,0]相同)
另外,要制作is_in
,我必须使用之前制作的功能:
def exists(L, p):
""" list[alpha] * (alpha -> bool) -> bool
Return True if at least one element x of L is such as p(x)==True"""
for a in L:
if p(a):
return True
return False
我们刚刚开始研究高阶函数,所以我设法写了几个,但没有写这个。
感谢您的帮助
答案 0 :(得分:0)
好,所以我尝试做@chepner告诉我的事情
def is_in(eq, e, E):
""" (alpha * alpha -> bool) * alpha * list[alpha] -> bool
Retourne True si e est égal selon eq à un élément de E"""
if len(E)==0:
return False
else:
def _eq(x):
for i in E:
if eq(x, i):
return True
return False
return exists(E, _eq(e))
您觉得这对吗?
编辑: 好的,我想我可以解决这个问题:
def is_in(eq, e, E):
""" (alpha * alpha -> bool) * alpha * list[alpha] -> bool
Retourne True si e est égal selon eq à un élément de E"""
def _eq(x):
return eq(x, e)
return exists(E, _eq)
答案 1 :(得分:-1)
您不需要任何这些。这是单线的:仅直接return (e in E)
:
def is_in(e, E):
return (e in E)
zoo = ['ant','bat','cat','dog','eel']
>>> is_in('fox', zoo)
False
>>> is_in('cat', zoo)
True
>>> is_in('caterpillar', zoo)
False
无需递归。无需测试长度为0的特殊情况,测试e in E
也会处理该问题,并轻松返回False。
(顺便说一句,您也可以将in
与集合和列表一起使用。Python具有set()
类型。)