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 中的递归、尾递归、模式匹配和列表数据结构。祝你好运!
我有这个尾递归函数,它应该得到两个列表并将它们附加到第三个列表中。
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 中的递归、尾递归、模式匹配和列表数据结构。祝你好运!