【问题标题】:Passing a Set[List[Int]] typed value instead of List[Int] - why does that work?传递 Set[List[Int]] 类型的值而不是 List[Int] - 为什么会这样?
【发布时间】:2016-11-27 17:06:39
【问题描述】:

当我查看签名和函数调用时,我很难理解以下内容。

在我的工作表中,我有以下内容(摘自 Coursera 讲座):

 object nqueens {

  def queens(n: Int) : Set[List[Int]] = {
    def placeQueens(k: Int) : Set[List[Int]] =
      if (k == 0) Set(List())
      else
      for  {
        queens <- placeQueens(k - 1)
        col <- 0 until n
        if isSafe(col, queens)
      } yield col :: queens
    placeQueens(n)
  }

  def isSafe(col: Int, queens: List[Int]) : Boolean = {
    val row = queens.length
    val queensWithRow = (row - 1 to 0 by -1) zip queens
    queensWithRow forall {
      case (r, c) => col != c && math.abs(col - c) != row -r
    }
  }

  def show(queens: List[Int]) = {
    val lines =
      for (col <- queens.reverse)
        yield Vector.fill(queens.length)("* ").updated(col, "X ").mkString
    "\n" + (lines mkString "\n")
  }

  (queens(4) map show) mkString "\n"

}

考虑placeQueenisSafe的签名:

def placeQueens(k: Int) : Set[List[Int]]

def isSafe(col: Int, queens: List[Int]) : Boolean

我想知道为什么它会起作用。我们调用placeQueens 并将结果保存在queens 中(在for 循环中)。

结果应该是Set[List[Int]] 类型。然后我们使用IntSet[List[Int]] 这两个参数调用isSafe - 但我不明白为什么会这样,因为queens 应该是Set[List[Int]] 类型,而isSafe 的参数应该是List[Int]

【问题讨论】:

    标签: scala types signature


    【解决方案1】:

    我们调用placeQueens并将结果保存在queens(在for循环中)。

    不,您正在调用 placeQueens 并迭代结果。在每次迭代中,queens 引用当前元素。

    【讨论】:

      【解决方案2】:

      我们调用placeQueens并将结果保存在queens中

      您的代码没有将placeQueens 的结果保存到queens

      for  {
          queens <- placeQueens(k - 1)
          col <- 0 until n
          if isSafe(col, queens)
        } yield col :: queens
      

      这段代码实际上是用于理解。有问题的特定行:

      queens <- placeQueens(k-1) 
      

      正在将List[Int] 存储到皇后中,因为它正在迭代从placeQueens 返回的Set[List[Int]]。为了给出一个可能有助于说明正在发生的事情的简单示例,请考虑:

      val a = Set(1,2,3)
      val b = for (x <- a) yield x + 2
      

      执行此代码后,b 将变为Set(3,4,5)。这是因为在 for 循环的每次迭代中,x 首先是 1,然后是 2,然后是 3。

      【讨论】:

        猜你喜欢
        • 2011-07-01
        • 1970-01-01
        • 2020-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        相关资源
        最近更新 更多