模式匹配不匹配给定变量

Cri*_*llo 1 scala pascals-triangle

我已经实现了 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ler 5

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

case n if n == row => 1
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*l M 5

除了 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在例如Scala 编程书籍的相关章节中阅读有关此行为的更多信息(搜索反引号关键字)