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 コンパイラによって desugar されています。

アルゴリズムも非常に単純です。任意の再帰関数で停止ポイント (リストが空の場合) が必要な場合は、アキュムレータ (この場合は文字列) を返すだけです。どちらの場合も、新しい繰り返しで関数を再度呼び出しています (リストの末尾を返し、アキュムレータに頭を入れます)。

Scalaでは、再帰関数の結果の型を明示的に指定する必要があることに注意してください (この場合はString) 。

于 2013-10-21T08:58:49.323 に答える