2013-10-21 50 views
0

我正在參加coursera的scala課程,我正在嘗試那裏正在教授的東西。那麼現在我遇到這個名單他們稱之爲「ConsList」?我試圖給它一個tail-recursive toString()方法。我想我必須保持像累加器那樣的東西,但我不知道該怎麼做。任何幫助都感激不盡。我如何讓scala的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 + "}" 
} 

回答

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編譯器解析的。算法也非常簡單,就像在任何遞歸函數中需要一些停止點(當列表爲空時),然後你只要返回你的累加器(在這種情況下是一個字符串)。在任何一種情況下,您都會使用新的迭代函數再次調用函數(返回列表尾並將頭放入累加器中)。

記住,在斯卡拉必須提供遞歸函數明確的結果類型(在這種情況下String

+0

你的答案真的有幫助!非常感謝:)但是,你使用'xs'作爲列表名稱的原因是什麼?我發現馬丁odersky也在視頻中做同樣的事情,這是一個命名約定? – Somjit

+0

@SomjitNag yep,這個來自列表,在FP中非常常見,只是表示X'es,很多X,其中X只是變量的常用名字(例如在數學函數中經常使用) – 4lex1v

+0

ahh! 「很多」-s >>'xs'很高興知道!謝謝 :) – Somjit