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

如何使toString()尾部在scala中递归,scala,recursion,Scala,Recursion,我正在coursera上scala课程,我正在尝试那里教的东西。所以现在我看到了这个名单,他们称之为“ConsList”?我试图给它一个尾部递归toString()方法。我想我必须保留一些类似于累加器的东西,但我也不知道该怎么做。任何帮助都将不胜感激 以下是我尝试过的: /** a non-empty element/node of the list */ class Cons[T](val head: T, val tail: List[T]) extends List[T] { def

我正在coursera上scala课程,我正在尝试那里教的东西。所以现在我看到了这个名单,他们称之为“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 + "}"
}

在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循环非常相似,在while循环中,它实际上是由scala编译器设计的

算法也很简单,就像在任何递归函数中,需要一些停止点(当列表为空时),然后返回累加器(在本例中是字符串)。在这两种情况下,您都会使用新的迭代再次调用函数(返回list tail并将head放入累加器)


请记住在Scala中,必须为递归函数提供显式的结果类型(在本例中为
String

在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循环非常相似,在while循环中,它实际上是由scala编译器设计的

算法也很简单,就像在任何递归函数中,需要一些停止点(当列表为空时),然后返回累加器(在本例中是字符串)。在这两种情况下,您都会使用新的迭代再次调用函数(返回list tail并将head放入累加器)


请记住在Scala中,您必须为递归函数提供显式的结果类型(在本例中为
String

您的答案非常有用!非常感谢:)但是,您使用
xs
作为列表名的原因是什么?我发现martin odersky在视频中也做了同样的事情,这是命名约定吗?@SomjitNag yep,这来自列表,在FP中非常常见,只是意味着X'e,很多X,其中X只是变量的一个常用名称(例如在数学函数中经常使用),你的答案真的很有帮助!非常感谢:)但是,您使用
xs
作为列表名的原因是什么?我发现martin odersky在视频中也做了同样的事情,这是一个命名约定吗?@SomjitNag yep,这来自列表,在FP中非常常见,只是表示X'e,多个X,其中X只是一个变量的通用名称(例如在数学函数中经常使用)