-1

タプルリスト(タプルが正しい用語であるかどうかはわかりません。つまり、(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

しかし、それでもエラーが発生します...どうすれば解決できますか?

4

1 に答える 1