创建一个函数,但也要确保我实现另一个函数。可能吗?

时间:2014-05-16 17:15:12

标签: algorithm scala for-loop recursion

我正在遵循课程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,因为功能与完成此功能所需的功能完全不同。如果我错过了这一点,你能指出我应该如何解决这个问题吗?

注意 请不要给我烘焙代码

1 个答案:

答案 0 :(得分:6)

对于集合中的某些元素,如果谓词p对于集合的所有元素都不是false,则谓词Set为真。

鉴于您的问题,IntInt => 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}}。