次の方法で任意のアーリーツリー構造を出力しました。 (深い最初の検索)forループがスカラーの末尾の再帰的な状態に達するのを避ける
def treeString[A](tree: Tree[A]): String = {
def DFS(t: Tree[A], acc: String = "", visited: List[String] = Nil, toClose: Int = 0): String = t match {
case Leaf(id, terminal) if !visited.contains(id) => {
acc + " " + terminal.name + "[" + id.toString + "] " + ")"*toClose
}
case Node(id, op, args @_*) if !visited.contains(id) => {
var state = acc + " " + op.name + "[" + id.toString + "] " + "("
var args_visited: List[String] = List(id)
for (i <- args.tail) {
state = DFS(i, state , visited ::: args_visited) + " , "
args_visited = args_visited ++ List(i.id)
}
DFS(args.head, state , visited ++ args_visited, toClose + 1)
}
case _ => acc
}
DFS(tree)
}
Scalaのコンパイラは、この関数はtail recursive
ではないと主張します。しかし、私は適切なDFS(..)
呼び出しを持っている末尾の位置。ループ内で行われたすべてのDFS(..)
コールは繰り返し実行され、スタックセーフになります。
ツリーが無限に深い場合は、スタックオーバーフローが発生することを理解しています。これらの事件に対処する技術はありますか?
を作業物事を置くために悪夢で、JVMの再帰の問題が存在します'state = DFS(i、state、visited ::: args_visited)+"、 "'は末尾にはありません。独自のスタックを使用します。 –