您是否总能构造一个用于tail-call消除的递归函数?如果不是,还有什么其他策略来限制堆栈大小?在Scala中限制递归深度
例如: (由Break or shortcircuit a fold in Scala启发)
// Depth-first search of labyrinth, with large depth > stacklimit
def search (labyrinth: SearchDomain,
path: List[SolutionNode],
goal: DesiredResult) = {
if (path.head == goal) return path
candidates: List[SolutionNode] = labyrinth.childNodes(path)
candidates.find { c =>
Nil != search(labyrinth, c :: path, goal) // potential boom!
} match {
case Some(c) => c :: path
case None => Nil
}
}
的目标不是要吹毛求疵这个特殊的功能,但是用它作为道具来学习技术来限制堆栈大小。
UPDATE
从此我的外卖是:
如果问题域是这样的,递归可能会碰到堆栈大小的限制:
重写代码是scala编译器版本的tailcall可优化的。这可以通过新的(2.8)@ scala.annotation.tailrec注释来辅助/验证。
如果这不可行,重写它以使用迭代循环结构。
我也意识到这种重写(无论是哪种情况)都需要一定的技巧/才能/智慧/练习。
Rewritting递归只是需要练习。起初它非常困难,但是当你习惯这种技术时,它变得越来越直接,如果不是那么容易的话。有时候,这是不值得的努力 - 另一件事,你会练习的眼睛。 – 2009-10-21 13:12:08