2017-06-13 16 views
0

私は次の演習がありますHaskellの変換〜コード説明

は、バランスの取れた木に与えられた順序付きリストを変換する関数を定義しlist2tree - 右の高さとのために左のサブツリーをこのツリーの任意のノードは、最大で1だけ異なることがあります。

誰もこのコードを説明することはできますか?また、私はどのようにコンソールでツリーをテストできますか?

ソリューション:

data Tree a = Leaf a 
      | Node a (Tree a) (Tree a) 
      | Null 

list2tree [] = Null 
list2tree [x] = Leaf x 
list2tree list = Node x (list2tree ltx) (list2tree gtx) 
       where 
       m = length list `div` 2 
       x = list !! m 
       ltx = take m list 
       gtx = drop (m+1) list 
+1

正確にあなたがコードについて理解していませんか?これまでに何を試しましたか? –

答えて

3

何この関数は、リストのすべての半分を再帰そして、リスト内の真ん中の要素を取っノードとしてそれを置くこととされてい。 mは、中間の要素の位置です。ltx(「xより小さい」という意味です)はすべて下位の要素です。xgtxはすべてxより上位の要素です。

2

、GHCiの中でテストShowTreeインスタンスにするために、コマンドラインから

data Tree a = Leaf a 
      | Node a (Tree a) (Tree a) 
      | Null 
      deriving (Show) 

スタートGHCiのを、そしてTreelist2treeを含むファイルをロードします。私は44520938.hsそれを呼んだ:

Prelude> :load 44520938.hs 
[1 of 1] Compiling Answer   (44520938.hs, interpreted) 
Ok, modules loaded: Answer. 

今あなたがテストにさまざまな入力リストで関数を呼び出すことができます。

*Answer> list2tree [] 
Null 
*Answer> list2tree [1] 
Leaf 1 
*Answer> list2tree [1, 2] 
Node 2 (Leaf 1) Null 
*Answer> list2tree [1, 2, 3] 
Node 2 (Leaf 1) (Leaf 3) 
+0

後、このコードがどのように動作するのか理解できません。テスト用にこの演習を覚えておく必要があります。しかし、その仕組みを理解することが重要です – csandreas1