你能总是构造一个递归函数来消除尾调用吗?如果不是,限制堆栈大小的其他策略是什么?
例如:(受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
}
}
目标不是挑剔这个特定的函数,而是将其用作学习限制堆栈大小的技术。
更新
我的收获是:
如果问题域使得递归可能达到堆栈大小的限制:
将代码重写为 scala-compiler-version-of-tailcall-optimizable。这可以通过新的 (2.8) @scala.annotation.tailrec 注释来辅助/验证。
如果这不可行,请重写它以使用迭代循环结构。
我也感觉到这种重写(无论哪种情况)都需要一定的技能/才能/智能/实践。