5

私は IT 学生で、OCaml の初心者です。

最近、試験勉強をしていてこのエクササイズを見つけました。

指定: type 'a tree = Tree of 'a * 'a tree list

関数 mtree を定義します: 'a tree ->'a は、OCaml の通常の順序関係 (<=) に従って、多方向ツリー内のすべてのノードの最大値を返します。

私は以下のようなことをするようになりましたが、もちろんうまくいきません。

let rec mtree (Tree (r, sub)) =
        let max_node (Tree(a, l1)) (Tree(b, l2)) =
            if a >= b then (Tree(a, l1)) else (Tree(b, l2)) in
        List.fold_left max_node r sub;;

これに対する回答を読んだ後、修正コードを投稿しています。

let rec mtree (Tree(r,sub)) =
    let max_node (Tree(a, l1)) (Tree(b, l2)) =
        if a >= b then a else b in
    List.fold_left (max_node) r (List.map mtree sub);;

アイデアは同じです。ローカル関数を使用してノードを比較してリストを折り畳み、連続したレベルのノード リストで関数自体を呼び出してツリーを移動します。

ただし、まだ機能していません。fold_left 部分の max_node について不平を言うようになりました。

Error: This expression has type 'a tree -> 'a tree -> 'a
       but an expression was expected of type 'a tree -> 'a tree -> 'a tree

そして、ここで私は間違いなく道に迷っています。

4

2 に答える 2

4

このコードはかなり信頼できます (IMHO)。欠けている重要なことは、サブツリーのサブツリーをトラバースしないことです。関数を再帰的に定義することに注意してください (これは非常に合理的です) が、それ自体を呼び出すことはありません。

指摘すべきもう 1 つの問題は、問題のステートメントがツリーからの「値」を要求しているのに、コードがツリー ノード全体を返していることです。

于 2013-06-28T18:13:11.877 に答える