【问题标题】:Checking whether an Array[A] is sorted?检查 Array[A] 是否已排序?
【发布时间】:2017-11-20 11:20:10
【问题描述】:

在解决“Scala 中的函数式编程”中发现的问题时:

实现isSorted,检查一个Array[A]是否按照给定的比较函数排序:

def isSorted[A](as: Array[A], ordered: (A,A) => Boolean): Boolean

在将我的答案与作者提供的以下解决方案进行比较时:

  // Exercise 2: Implement a polymorphic function to check whether
  // an `Array[A]` is sorted
  def isSorted[A](as: Array[A], gt: (A,A) => Boolean): Boolean = {
    @annotation.tailrec
    def go(n: Int): Boolean =
      if (n >= as.length-1) true
      else if (gt(as(n), as(n+1))) false
      else go(n+1)

    go(0)
  }

我对以下代码行感到困惑:else if (gt(as(n), as(n+1))) false

我认为在 Scala 中使用函数作为参数时,需要在当前函数范围之外实际定义一个单独的函数(即定义另一个函数来执行 gt 需要做的事情)?我没有看到在其他任何地方定义了gt,那么它如何能够提供Boolean 值以在isSorted 中使用?

我的假设是正确的,还是我在使用函数作为参数时完全遗漏了什么?非常感谢详细的解释。

【问题讨论】:

    标签: arrays scala functional-programming


    【解决方案1】:

    在这种情况下,gt 是作为参数传递给isSorted 的函数; 让我们将它与任何其他参数进行比较,比如a: Int。我们来看下面的函数:

    def increaseByOne(a: Int): Int = a + 1
    

    您关于gt 的问题相当于问:“如果从未为a 赋值,increaseByOne 如何使用a”。显然,increaseByOne 方法的 调用者 必须传递一些值作为 a 的值,但参数的概念是命名提供给方法的一些值。 p>

    gt 也是如此:这是isSorted 的一个参数。在您提供的代码中,我们看不到isSorted调用者,因此我们看不到任何gt 可能是什么的示例——但显然实现 isSorted 的 em> 不需要假设 gt 的创建方式和位置,它作为参数传递,因此可以在 isSorted 中使用。

    我们可以想象这样的用法:

    isSorted(Array(1,3,6), (a: Int, b: Int) => a > b)
    

    这里,(a: Int, b: Int) => a > b 将是 gt 的值。

    【讨论】:

    • 谢谢,感谢详细的解释。一个小的后续问题,是否需要在调用 isSorted 时定义函数参数(即在您刚刚给出的示例中)?或者函数可以在别处定义,直接作为参数传入isSorted
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2018-04-10
    • 2012-02-05
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多