我正在通過Coursera課程(progfun)學習Scala。Scala使用可變變量來實現其apis
我們正在學習如何在功能上進行思考,並在可能的情況下使用尾遞歸來實現函數/方法。
而且就一個列表功能的foreach一個例子,我們教實現它,如:
def foreach[T](list: List[T], f: [T] => Unit) {
if (!list.isEmpty) foreach(list.tail) else f(list.head)
}
然後,我很驚訝,當我發現在一些斯卡拉以下實現的API:
override /*IterableLike*/
def foreach[B](f: A => B) {
var these = this
while (!these.isEmpty) {
f(these.head)
these = these.tail
}
}
那麼我們如何才能學會使用遞歸併避免使用可變變量,並且通過相反的技術來實現api?
看看scala.collection.LinearSeqOptimized
其中scala.collection.immutable.List
擴展。 (類似的實現在List類本身中找到)
遞歸容易使某些算法更簡單,更優雅,但運行速度較慢,佔用更多的堆棧如果不是尾部優化,需要一定的思維過程,開發這可能是困難一些。許多自然過程是遞歸的,但直到我們也有類似的天然電腦沒有幫助。爭取更多的觀點對「遞歸的缺點」搜索。見http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html的吉多·範羅蘇姆的觀點尤其是第三個。 – 2015-07-12 14:34:37