タプルリスト(タプルが正しい用語であるかどうかはわかりません。つまり、(x、y)リストです)とn分木を指定すると、葉を返す関数を作成しようとしていますタプルのキーがツリーに存在するかどうかを確認し、そのキーに関連付けられた値の位置に子を取得して、存在しない場合はエラーを発生させます。
うまく説明できていないことはわかっているので、例を挙げて説明します。tuple list = [(1,3);(2,2);(3,1);(10,1)] ルートの値が 1 の場合、3 番目の子をチェックします (そうでない場合は、子の値が 10 の場合、葉が見つかるまで最初の子をチェックします。
私がやろうと思ったことは、最初に List.map を使用して、タプルのキーと一致しない要素と、関連付けられた値の値の位置にない子を削除してから、子に対して同じことを再帰的に行うことでした。
これが私がしたことです:
type 'a ntree = Tr of 'a * 'a ntree list;;
let leaf x = Tr(x,[]);;
let alb = Tr(1,[Tr(2,[leaf 3; leaf 4; leaf 2]);Tr(5,[leaf 11; leaf 10]);Tr(3,[leaf 9; leaf 7; leaf 10])]);;
let guida = [(1,3);(2,2);(3,1);(10,1);(16,2);(11,2)];;
let rec cerca_foglia guida (Tr(x,tlist)) =
match tlist with
[] -> x
|_ -> List.map(fun a -> List.mem_assoc x guida && (*a.position = List.nth tlist List.assoc x guida*)) (cerca tlist)
and cerca = function
[] -> raise NotFound
|[t] -> cerca_foglia guida t
|t::rest ->
try cerca_foglia guida t
with NotFound -> cerca rest
もちろん、a.position は存在しないので、どうすれば確認できますか?
私も別の方法で試しました:
let rec cerca_foglia guida (Tr(x,tlist)) =
match tlist with
[] -> x
|_ -> List.map(fun a -> a = List.nth tlist List.assoc x guida) (cerca tlist)
and cerca = function
[] -> raise NotFound
|[t] -> if List.mem_assoc t guida then cerca_foglia guida t else raise NotFound
|t::rest ->
try cerca_foglia guida t
with NotFound -> cerca rest
しかし、それでもエラーが発生します...どうすれば解決できますか?