簡體   English   中英

有沒有辦法優化 Scala 中的尾調用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM