我有这个尾部递归函数,该函数应该获得两个列表并将它们附加到第三个列表中。
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!
答案 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数据结构。祝你好运!