2017-10-31 5 views
0

私はクラスのOCamlを学んでおり、バイナリツリーのミラーイメージを計算する割り当てが与えられました。私はかなりこだわっているとさえ開始するかどうかはわからない...OCamlバイナリツリーミラーイメージ

type btree = Empty | Node of int * btree * btree 
;; 

let mirror : btree -> btree 
    = fun t -> (* Code *) 

サンプル入力:

let tree1 = Node(1, Node(2, Node(3, Empty, Empty), Empty), Node(4, Empty, Empty)) 
;; 

出力例:

mirror tree1 = Node(1, Node(4, Empty, Empty), Node(2, Empty, Node(3, Empty, Empty))) 
;; 
+1

https://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions簡単な何かを始める – gallais

+1

:コード何ができますかノード(1、空、空)をミラーリングするには?ノード(1、ノード(2、空、空)、空)?それから一般化する(以下のジンの答えを参照)。あなたの試練を投稿する - あなたは助けを受けるチャンスが増えるだろう。 –

+1

通常、MLではパターンマッチングを使用しますが、あなた(またはあなたのインストラクター)が[s-expressions](https://en.wikipedia.org/wiki/Cons)に似たサンプルを提供しているのは面白いです。 – PieOhPah

答えて

2

match機能を使用します。

matchの値の構造は、その型によって定義されています。あなたの例では、btreeタイプの値は、EmptyコンストラクタまたはタプルコンストラクタNode of int * btree * btreeで作成されます。あなたはこのようなもので終わる必要があります。

... 
match t with 
| Node (num, lt, rt) -> (* do something to switch the subtrees, and mirror the subtrees themselves *) 
| Empty -> (* do nothing *) 
... 

mirror機能はタイプbtree -> btreeであるため、あなたのマッチ例は、それぞれのタイプbtreeの有効な値を返す必要があります。

参照:http://ocaml.org/learn/tutorials/data_types_and_matching.html#Pattern-matching-on-datatypes