模式匹配不匹配给定变量

Pattern matching not matching given variable

我已经实现了 pascal 的三角形,但它有些问题,因为当 col match { case row => ...} 它没有正确匹配 col 与行:

def main(args: Array[String]) {
println("Pascal's Triangle")
for (row <- 0 to 10) {
  for (col <- 0 to row) {
    val res: Int = pascal(col, row)
    print(res + " ")
  }
  println()
}

def pascal(col: Int, row: Int): Int = {
    col match {
      case 0 => 1
      case row => 1
      case _ => pascal(col-1, row-1) + pascal(col, row-1)
    }
}

您的 row 匹配正在隐藏方法参数。为了实现你想要的,你可以尝试为你的模式匹配使用所谓的守卫,例如

case n if n == row => 1

有了这个,你有 3 个案例,0 案例,n is equal to given row parameter 案例和 default 案例。否则,row 匹配将匹配所有不等于 0 的剩余数字,这将使最后的 _ 匹配永远不会被触发。

对于 Martin 的回答,您也可以使用反引号来获得相同的结果:

def pascal(col: Int, row: Int): Int = {
  col match {
    case 0 => 1
    case `row` => 1
    case _ => pascal(col-1, row-1) + pascal(col, row-1)
  }
}

您可以阅读有关此行为的更多信息,例如 Programming in Scala book 的相关章节(搜索 backticks 关键字)