我在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告诉我该方法是递归的。我应该引入注释$ @ $吗?我该如何介绍呢?
答案 0 :(得分:4)
Scala有一个注释scala.annotation.tailrec
,您可以使用它来将方法标记为尾递归。它提供了一个编译时检查,以确保该方法确实是尾递归(但对代码没有影响)。
然而,您的方法不是尾递归的。一般递归没有特殊注释。 Intellij只是通过将其标记为递归来尝试帮助,因此您可以看到它一目了然(如果它是尾递归的话,它还会提供不同的标记)