Bul*_*ula 3 algorithm recursion for-loop scala
我正在遵循课程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)
}
Run Code Online (Sandbox Code Playgroud)
但是,这个功能如何帮助我以任何方式创建存在?我的意思是我想到的是存在完全相同的功能,但不是在条件满足时迭代,我只需要返回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)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是天气,我认为是正确的,如果是,那么我将如何实现forall,因为功能与完成此功能所需的功能完全不同.如果我错过了这一点,你能否指出我应该如何解决这个问题?
注意 请不要给我烘焙代码
如果一个p元素的某些元素不适false用于该元素的所有元素,则该谓词属实.
鉴于您的问题,它似乎Set是一个可迭代的集合Int,因为谓词具有类型Int => Boolean.
您可以通过创建lambda表达式来创建此谓词类型的实例,例如
val gt: Int => Boolean = x => x > 10
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用给定的值调用它
gt(4) //false
gt(11) //true
Run Code Online (Sandbox Code Playgroud)
因此,解决此问题的关键是否定给定谓词,即您需要创建具有以下签名的函数:
def negate(p: Int => Boolean): Int => Boolean
Run Code Online (Sandbox Code Playgroud)
一旦你写完,就可以直接从定义中实现exists你的foreach功能.