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

标签 scala recursion pattern-matching tail-recursion case-class

我对 java 的 scala 还很陌生,对模式匹配也很陌生。我试图弄清楚的一件事是何时使用它以及它的成本/ yield 是什么。比如这个

def myThing(a: Int): Int = a match {
  case a: Int if a > 0 => a
  case _ => myThing(a + 1)
}

和这个做同样的事情(除非我真的误解了什么)

def myThing(a: Int): Int = {
  if (a > 0) a
  else myThing(a + 1)
}

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

还有什么我需要担心的,比如资源?还是我应该总是尝试使用模式匹配?

我搜索了这些答案,但没有找到任何“最佳实践”!

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

最佳答案

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

def myThing(a: Int): Int =  if (a > 0) a else myThing(a + 1)

这绝对比模式匹配更方便。模式匹配在以下情况下很方便:

还有 to ensure you function is tail-recursive你可以使用 @tailrec 注释

关于Scala 案例类和尾递归最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29721476/

相关文章:

Scala - 使用谓词函数来总结字符串列表

scala - 如何配置 Spark Streaming Scala 应用程序以从 Hadoop + Yarn 上的 HBase 读取

Scala 类型推断不适用于泛型案例类和 lambda

javascript - 迭代是否比递归更快,或者只是不太容易发生堆栈溢出?

c# - 异步ctp递归

scala - 在 Scala 代码中使用全部大写字母

c - 嵌套 for 循环仅为 O(n)

haskell - 如何递归地将函数转换为cps

haskell - 省略 `function [] _ = ...; function _ [] = ...` 语法时模式匹配失败

list - 避免不完整的模式匹配