【问题标题】:Creating a function but also make sure I implement another one. Is it possible?创建一个函数,但还要确保我实现另一个函数。可能吗?
【发布时间】:2014-05-17 02:06:03
【问题描述】:

我正在关注 coursera scala 课程,所以请注意不要只给我已经烘焙的代码,因为这会违反荣誉代码。我不是在寻找代码,而是在寻找算法的逻辑以及如何实现我想到的东西。

首先,问题来了:

使用'forall',实现一个函数'exists',它测试一个集合是否 至少包含一个给定谓词为真的元素。 请注意,函数 '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,因为该功能与完成此功能所需的功能完全不同。如果我没有抓住重点,您能否指出我应该如何解决这个问题?

注意 请不要给我烘焙代码

【问题讨论】:

  • 一个谓词 p 对集合中的某些元素为真,如果它对集合的所有元素不为假。
  • 嗯,是的,这就是我在第二个函数中尝试实现的目标,但它要求我实现 forall
  • 提示:它们都是折叠...一个以false开头,另一个以true开头!
  • @Bula - 我给出的定义是用forall 来定义exists,所以你应该能够直接将它翻译成代码。
  • @Lee 请将其放入答案中。

标签: algorithm scala for-loop recursion


【解决方案1】:

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

鉴于您的问题,它显示为SetInt 的可迭代集合,因为谓词的类型为Int => Boolean

您可以通过创建 lambda 表达式来创建此谓词类型的实例,例如

val gt: Int => Boolean = x => x > 10

然后你可以用给定的值调用它

gt(4)  //false
gt(11) //true

因此,这个问题的关键在于否定给定的谓词,即您需要创建一个具有以下签名的函数:

def negate(p: Int => Boolean): Int => Boolean

一旦你写了,你就可以直接从定义中根据你的foreach 函数来实现exists

【讨论】:

  • 我创建了否定函数:def negate(f: Int=>Boolean): Int=>Boolean = x=> !f(x),然后我将它应用于 forall 的谓词,但是我的测试仍然失败。我不确定我在这里缺少什么
  • @Bula - “...如果集合的所有元素 not 为 false。”显然,您对 exists 的实现需要正确才能使其正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 2010-10-17
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多