Scala案例类和尾递归最佳实践

Ham*_*ish 3 recursion scala tail-recursion pattern-matching case-class

我对java中的scala相当新,也是模式匹配的新手.我试图解决的一个问题是何时使用它以及它的成本/收益是什么.例如这个

def myThing(a: Int): Int = a match {
  case a: Int if a > 0 => a
  case _ => myThing(a + 1)
}
Run Code Online (Sandbox Code Playgroud)

与此相同(除非我真的误解了一些东西)

def myThing(a: Int): Int = {
  if (a > 0) a
  else myThing(a + 1)
}
Run Code Online (Sandbox Code Playgroud)

所以我的实际问题是: 但它们是否以同样的方式运行?我的模式匹配示例尾递归吗?如果没有,那么为什么不在第二个例子中呢?

还有其他我应该担心的事情,比如资源吗?或者我应该总是尝试使用模式匹配?

我一直在寻找这些答案,但没有找到任何"最佳实践"!

编辑:我知道使用的例子有点做作 - 我刚刚添加它以清楚它下面的问题 - 谢谢!

Odo*_*ois 6

是的,他们确实运行相同.每种语法糖的最佳实践都是相同的:只要它提供更易读或更灵活的代码,就可以使用它.在您的示例中,如果if声明您可以省略大括号并且只写

def myThing(a: Int): Int =  if (a > 0) a else myThing(a + 1)
Run Code Online (Sandbox Code Playgroud)

这肯定比模式匹配更方便.模式匹配在以下情况下很方便:

另外,为了确保函数是尾递归,您可以使用@tailrec注释