我正在遵循课程scala课程,所以请注意,您不要只给我已经烘焙的代码,因为这将违反荣誉代码。我不是在寻找代码,而是寻找算法的逻辑,以及如何实现我想到的东西。
首先,问题在于:
使用'forall',实现一个函数'exists'来测试一个集合 包含至少一个给定谓词为true的元素。 请注意,函数'forall'和'exists'的行为类似于通用 和一阶逻辑的存在量词。
基本上我理解的是:
创建'存在'。确保它在某处实现。
我创建了forall:
def forall(s: Set, p: Int => Boolean): Boolean = {
def iter(a: Int): Boolean = {
if (a > bound) true
else if (contains(s,a)) if(!p(a)) false else iter(a+1)
else iter(a+1)
}
iter(-bound)
}
然而,这个功能如何帮助我以任何方式创建存在? 我的意思是我想到的是存在完全相同的功能,但不是在条件满足时迭代,我只需要返回true,因为找到了一个案例。从理论上讲,我不需要关心其他情况,因此只需要在第二个'if'返回true的位置进行迭代(这意味着第一个集合中的一个数字不能应用于第二个函数)。让我更好地说明这一点:
def exists(s: Set, p: Int => Boolean): Boolean = {
def iter(a: Int): Boolean = {
if (a > bound) true
else if (contains(s,a)) if(!p(a)) iter(a+1) else true
else iter(a+1)
}
iter(-bound)
}
我的问题是天气,我认为是正确的,如果是,那么我将如何实现forall,因为功能与完成此功能所需的功能完全不同。如果我错过了这一点,你能指出我应该如何解决这个问题吗?
注意 请不要给我烘焙代码
答案 0 :(得分:6)
对于集合中的某些元素,如果谓词p
对于集合的所有元素都不是false
,则谓词Set
为真。
鉴于您的问题,Int
是Int => Boolean
的可迭代集合,因为谓词的类型为val gt: Int => Boolean = x => x > 10
。
您可以通过创建lambda表达式来创建此谓词类型的实例,例如
gt(4) //false
gt(11) //true
然后您可以使用给定的值调用
def negate(p: Int => Boolean): Int => Boolean
因此,这个问题的关键是否定一个给定的谓词,即你需要创建一个具有以下签名的函数:
exists
一旦您写完,就可以直接从定义中实现foreach
函数{/ 1}}。