@tailrec annotated方法包含一个不在尾部位置的递归调用

时间:2015-03-29 19:54:41

标签: eclipse scala recursion pattern-matching tail-recursion

以下是演示我的问题的最小示例:

@tailrec
def fun(x: Int): Int = {
  val y = x match {
    case 5 => return fun(6)
    case 7 => return fun(6)
    case 6 => 40
    case _ => throw new AssertionError("only 5, 6 and 7 allowed")
  }
  y + 2
}

Eclipse抱怨以下错误消息:

could not optimize @tailrec annotated method
it contains a recursive call not in tail position

由于return关键字,有两个递归调用,据我所知,在尾部位置。

Eclipse究竟抱怨什么?我只是没有看到它。

1 个答案:

答案 0 :(得分:5)

return导致它不是尾调用。

请改用以下内容:

@tailrec
def fun(x: Int): Int = x match {
  case 5 => fun(6)
  case 7 => fun(6)
  case 6 => 42
  case _ => throw new AssertionError("only 5, 6 and 7 allowed")
}

这可能是一个实现错误,或者与return x编译代码的可能性有关,该代码在检查{{1}之后的编译阶段引发NonLocalReturnControl异常}。