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

时间:2019-12-04 17:42:04

标签: scala list tail-recursion

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

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, ?::?)这样的尾递归函数的最后一行,这是出于初始化的目的吗?我想我也听说这是结束之前的最后一个(递归)调用。无论如何,有人可以向我详细解释这句话吗?请不要给我提示如何以其他方式编写此函数。我只想了解此行的目的是什么,我必须在此处给出(问号在哪里)。提前THX!

1 个答案:

答案 0 :(得分:0)

首先,下面的正确追加列表到列表功能:

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中的递归,尾递归,模式匹配和List数据结构。祝你好运!

相关问题