末尾呼び出しを除去するための再帰関数を常に構築できますか?そうでない場合、スタックサイズを制限する他の戦略は何ですか?
例:( ScalaのBreakまたはFoldの短絡に触発された)
// 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アノテーションによって支援/検証できます。
それが不可能な場合は、反復ループ構造を使用するように書き直してください。
また、この書き直し(どちらの場合も)は、ある程度のスキル/才能/賢さ/練習が必要だと感じています。