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)
所以我的实际问题是: 但它们是否以同样的方式运行?我的模式匹配示例尾递归吗?如果没有,那么为什么不在第二个例子中呢?
还有其他我应该担心的事情,比如资源吗?或者我应该总是尝试使用模式匹配?
我一直在寻找这些答案,但没有找到任何"最佳实践"!
编辑:我知道使用的例子有点做作 - 我刚刚添加它以清楚它下面的问题 - 谢谢!
是的,他们确实运行相同.每种语法糖的最佳实践都是相同的:只要它提供更易读或更灵活的代码,就可以使用它.在您的示例中,如果if声明您可以省略大括号并且只写
def myThing(a: Int): Int = if (a > 0) a else myThing(a + 1)
Run Code Online (Sandbox Code Playgroud)
这肯定比模式匹配更方便.模式匹配在以下情况下很方便:
另外,为了确保函数是尾递归,您可以使用@tailrec注释