Можете ли вы всегда структурировать рекурсивную функцию для устранения хвостового вызова? Если нет, то каковы другие стратегии для ограничения размера стека?Предельная глубина рекурсии в 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-optimizable. Это может быть подтверждено/подтверждено новой аннотацией (2.8) @ scala.annotation.tailrec.
Если это невозможно, перепишите его для использования итерационных циклов.
У меня также есть смысл, что это переписывание (в любом случае) - это то, что требует определенного уровня умения/таланта/умений/практики.
переписано рекурсии просто нужна практика. Сначала это очень сложно, но по мере того, как вы привыкаете к технике, она становится все более прямолинейной, если не всегда простой.Иногда это просто не стоит усилий - еще одна вещь, на которую вы будете следить за практикой. –