scala:尾递归函数中的这一行是什么意思?

scala: what means this line in tail recursive function?

我有这个尾递归函数,它应该得到两个列表并将它们附加到第三个列表中。

def append[T](as:List[T], bs:List[T]) : List[T] =
{
  def append_tailrec[T](as:List[T], bs:List[T], acc:List[T]) : List[T] =
  {
    as match
    {
      case x::xs => append_tailrec(xs, bs, x::acc);
      case (x::xs && as == Nil) => append_tailrec(as, xs, x::acc);
      case (bs == Nil) => acc;
    }
  }
  append_tailrec(as, bs, ?::?);
}

我不明白这里的任何尾递归函数的最后一行 append_tailrec(as, bs, ?::?) 这是为了初始化目的吗?我想我也听说这是完成前的最后一次(递归)调用。无论如何,有人可以向我详细解释这一行吗?请不要给我提示如何以另一种方式编写此函数。我只想了解此行的目的是什么以及我必须在此处提供的内容(问号所在的位置)。提前致谢!

首先,正确的附加列表到列表函数如下:

def append[T](as:List[T], bs:List[T]) : List[T] = {
  @scala.annotation.tailrec
  def append_tailrec(listA:List[T], listB:List[T], acc:List[T]): List[T] = {
    listA match {
      case Nil => listB match {
        case Nil => acc.reverse
        case b :: bs => append_tailrec(listA, bs, b :: acc)
      }
      case a :: as => append_tailrec(as, listB, a :: acc)
    }
  }
  append_tailrec(as, bs, Nil)
}

println(append(List(1, 2, 3), List(4, 5, 6))) // List(1, 2, 3, 4, 5, 6)
println(append(List(3, 2, 1), List(6, 5, 4))) // List(3, 2, 1, 6, 5, 4)

内部函数是尾递归的,第append_tailrec(as, bs, Nil)行是调用内部函数。尾递归函数是 scala 编译器的优化,它比递归函数更好。 在 tailrec 函数中,您可以在 acc 参数中累积结果,并且在每次递归调用中,如果 listA 为空,则从 listA 或 listB 添加新元素到 acc。 我认为你应该更多地阅读 scala 中的递归、尾递归、模式匹配和列表数据结构。祝你好运!