用于递归函数的Scala注释

时间:2017-03-13 20:57:02

标签: scala recursion intellij-idea

我在Intellij想法中有以下示例:

private def cond(tree: S.Tree, ct: Symbol, cf: Symbol): C.Tree = {
    implicit val pos = tree.pos
    (tree: @unchecked) match {
      case S.If(c,S.Lit(BooleanLit(b1@_)),S.Lit(BooleanLit(b2@_))) => (b1,b2) match{
        case (true,true) => cond(c,ct,ct)
        case (true,false) => cond(c,ct,cf)
        case (false,true) => cond(c,cf,ct)
        case (false,false) => cond(c,cf,cf)
      }
      case S.If(c,e,S.Lit(BooleanLit(true))) => letC(Seq(),cond(e,ct,cf),cond(c,_,ct))
      case S.If(c,e,S.Lit(BooleanLit(false))) => letC(Seq(),cond(e,ct,cf),cond(c,_,cf))
      case S.If(c,S.Lit(BooleanLit(true)),e) => letC(Seq(), cond(e,ct,cf),cond(c,ct,_))
      case S.If(c,S.Lit(BooleanLit(false)),e) => letC(Seq(),cond(e,ct,cf),cond(c,cf,_))


      case S.Prim(p: L3TestPrimitive, args) => translateParams(args)(C.If(p,_,ct,cf)) //???

      case r => nonTail(r)(o => nonTail(S.Lit(BooleanLit(false)))(n => C.If(L3Ne, Seq(o,n),ct,cf)))
    }
  }

IDE告诉我该方法是递归的。我应该引入注释$ @ $吗?我该如何介绍呢?

1 个答案:

答案 0 :(得分:4)

Scala有一个注释scala.annotation.tailrec,您可以使用它来将方法标记为尾递归。它提供了一个编译时检查,以确保该方法确实是尾递归(但对代码没有影响)。

然而,您的方法不是尾递归的。一般递归没有特殊注释。 Intellij只是通过将其标记为递归来尝试帮助,因此您可以看到它一目了然(如果它是尾递归的话,它还会提供不同的标记)