[英]Is there a way to optimize tail calls in Scala?
我知道 Scala 對尾遞歸函數(即遞歸調用是函數執行的最后一件事的函數)進行了優化。 我在這里要問的是是否有辦法優化對不同函數的尾調用。 考慮以下Scala
代碼:
def doA(): Unit = {
doB()
}
def doB(): Unit = {
doA()
}
如果我們讓它執行足夠長的時間,它會產生一個堆棧溢出錯誤,可以通過分配更多的堆棧空間來緩解這個錯誤。 盡管如此,它最終會超出分配的空間,並再次導致堆棧溢出錯誤。 減輕這種情況的一種方法可能是:
case class C(f: () => C)
def run(): Unit = {
var c: C = C(() => doA())
while(true){
c = c.f.apply()
}
}
def doA(): C = {
C(() => doB())
}
def doB(): C = {
C(() => doA())
}
然而,這被證明是相當緩慢的。 有沒有更好的方法來優化這個?
這是實現方法調用的無限進展的一種方法,無需消耗堆棧,其中每個方法決定下一個方法。
def doA(): () => Any = {
doB _
}
def doB(): () => Any = {
doC _
}
def doC(): () => Any = {
if (util.Random.nextBoolean()) doA _
else doB _
}
Iterator.iterate(doA())(_.asInstanceOf[() => () => Any]())
.foreach(identity)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.