0

我正在 coursera 上学习 scala 课程,我正在尝试那里教的东西。所以现在我遇到了这个他们称之为“ConsList”的列表?我试图给它一个尾递归的 toString() 方法。我想我必须保留类似 accumulator 的东西,但我也不知道该怎么做。任何帮助都感激不尽。

这是我尝试过的:

/** 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 + "}"
}
4

1 回答 1

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

于 2013-10-21T08:58:49.323 回答