如何在scala中使toString()尾递归

时间:2013-10-21 08:52:46

标签: scala recursion

我正在学习斯卡拉课程,我正在尝试那里教授的东西。所以现在我遇到这个列表,他们称之为“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 + "}"
}

1 个答案:

答案 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