【问题标题】:Scala tail recursion optimization inside a match匹配中的Scala尾递归优化
【发布时间】:2014-09-22 07:20:58
【问题描述】:

我正在通过尝试在 List[T] 上实现操作来自学 Scala。我刚刚实现了dropWhile,它让我想知道当递归调用出现在不同情况下时,尾递归优化是如何工作的。

def dropWhile[T](list: List[T])(predicate: T => Boolean): List[T] = list match {
  case head :: tail if predicate(head) => dropWhile(tail)(predicate)
  case _ => list
}

递归调用出现在第一种情况下重要吗?

【问题讨论】:

  • 没有。没关系。
  • 您可以通过将@scala.annotation.tailrec 放在定义前面来自己确认这一点——这不是必需的(即编译器可能会应用优化),但如果它使用注释进行编译,您就知道您的代码的编写方式可以应用优化。

标签: scala recursion stack-overflow tail-recursion


【解决方案1】:

正如 cmets 中的某些人所说,您可以将 @tailrec 注释应用于您的函数,如果无法将递归优化为循环,它将给出编译器错误。

递归调用的位置无关紧要。重要的部分是没有必要让堆栈帧保持分配状态等待递归调用的返回。

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2014-06-23
    • 2015-11-30
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多