Annotation.tailrec在scala中引发编译错误

Annotation.tailrec在scala中引发编译错误,scala,Scala,我正在用scala 2.11.8版本编写合并排序程序 以下是我的节目- object ListMergeSort { def main(args:Array[String]): Unit ={ val list:List[Int]= List(1,5,7,2,9,3,8,6,4) println(list) println(sort(list)) } def sort(l:List[Int]):List

我正在用scala 2.11.8版本编写合并排序程序

以下是我的节目-

 object ListMergeSort {

      def main(args:Array[String]): Unit ={
        val list:List[Int]= List(1,5,7,2,9,3,8,6,4)
        println(list)

        println(sort(list))
      }


      def sort(l:List[Int]):List[Int]= {
        l match{
          case Nil => l
          case h::Nil => l
          case _ =>
            val (l1,l2) = l splitAt(l.length/2)
            listMergeSort(sort(l1),sort(l2))
        }
      }

      //@annotation.tailrec
      def listMergeSort(l1:List[Int],l2:List[Int]):List[Int]={
        (l1,l2) match{
          case (Nil,l2) => l2
          case (l1,Nil) => l1
          case (h1::t1, h2::t2) => if (h1<h2) h1::listMergeSort(t1,l2) else h2::listMergeSort(l1,t2)
        }
      }
    }
对象列表合并排序{
def main(参数:数组[字符串]):单位={
val列表:列表[Int]=列表(1,5,7,2,9,3,8,6,4)
println(列表)
println(排序(列表))
}
定义排序(l:List[Int]):List[Int]={
我匹配{
案例Nil=>l
案例h::Nil=>l
案例=>
val(l1,l2)=l拆分(l.长度/2)
listMergeSort(排序(l1),排序(l2))
}
}
//@注释.tailrec
def listMergeSort(l1:List[Int],l2:List[Int]):List[Int]={
(l1,l2)匹配{
案例(无,l2)=>l2
案例(l1,无)=>l1
案例(h1::t1,h2::t2)=>如果(h1 res.reverse:::ys
案例(x::xs1,y::ys1)=>
如果(x
上面的程序也有类似的合并功能,但是@annotation.tailrec没有抛出任何错误


有人能帮忙吗?我的程序中出现错误的根本原因是什么?

编译器正在告诉你所有需要告诉的事情

这条线

if (h1<h2) h1::listMergeSort(t1,l2) else h2::listMergeSort(l1,t2)

…因为在
merge
返回后,没有什么要做的了,只需返回
merge()
返回的内容即可。

编译器会告诉您所有需要告诉的内容

这条线

if (h1<h2) h1::listMergeSort(t1,l2) else h2::listMergeSort(l1,t2)

…因为在
merge
返回后,没有什么要做的了,只需返回
merge()中的任何内容
返回。

是的,因为一个是尾部递归的,另一个不是。是的,因为一个是尾部递归的,而另一个不是。也许更容易看出是否使用普通的方法调用表示法而不是中缀运算符表示法来编写:
如果(h1)如果您使用普通的方法调用表示法而不是中缀运算符表示法来编写它,可能更容易看到:
if(h1
if (x < y) merge(x :: res, xs1, ys) else merge(y :: res, xs, ys1)