我正在学习斯卡拉课程,我正在尝试那里教授的东西。所以现在我遇到这个列表,他们称之为“ConsList”?我试图给它一个尾递归的toString()方法。我想我必须保留像累加器这样的东西,但我不知道该怎么做。任何帮助都感激不尽。
这是我试过的:
/** a non-empty element/node of the list */
class Cons[T](val head: T, val tail: List[T]) extends List[T] {
def isEmpty = false;
override def toString() =
if(tail.isEmpty) "{" + head + "}"
else "{" + head + tail + "}"
}
答案 0 :(得分:5)
在scala中实现累加器模式的最常用方法是通过内部方法:
def stringifyList[T](xs: List[T]) = {
@annotation.tailrec
def inner(cnt: List[T], acc: String): String = {
if (cnt.isEmpty) acc
else inner(cnt.tail, acc + cnt.head)
}
inner(xs, "")
}
如果你看一下你会看到tailrec函数背后的逻辑非常类似于while循环,其中它实际上是由scala编译器去掉的。
算法也很简单,就像在任何递归函数中你需要一些停止点(当列表为空)时,你只需要返回累加器(在本例中是一个字符串)。在任何一种情况下,您都会使用新的迭代再次调用函数(返回列表尾部并将头放入累加器)。
请记住在Scala中,您必须为递归函数提供显式结果类型(在本例中为String
)