2011-02-17 9 views
0

SMLで課題があるので、少し手伝ってください。 > int型のバイナリツリーの サイズを返す -SMLバイナリツリーリダクション機能

問題はBTREE」タイプの機能btree_sizeを書くこの

のようになります。 (バイナリツリーのサイズは、バイナリツリー内の 要素の数です)。たとえば、btree_size(Node(Leaf、1、 Node(Leaf、2、Leaf)))は2を返す必要があります。関数は btree_reduce関数を使用する必要があります。

がbtree_reduce機能は、この

(* A reduction function. *) 
    (* btree_reduce : ('b * 'a * 'b -> 'b) -> 'b -> 'a tree -> 'b) *) 
    fun btree_reduce f b bt = 
     case bt of 
     Leaf => b 
     | Node (l, x, r) => f (btree_reduce f b l, x, btree_reduce f b r) 

どのように世界で私はBTREEを取り、私の木の大きさを与えることを減らす機能を使用していますbtree_size機能を作るのですか?

答えて

2

これは宿題なので、私は直接回答をしません。 :)

次のように私は進むだろう

  • が関数の間で共通であるものを参照してください(あなたの仕様を満たしている再帰関数を書くことで)木の大きさを計算すると知り合いますbtree_reduce(またはあなたが書いた関数から抽象化されたもの)

これはもちろん多くの方法の1つです。

+0

ありあり再帰的に関数は微風です。 楽しいbtree_sizeのBT = => 0 リーフのBT ケース|私は1を追加するために減らす機能を伝える方法がわからないノード(BTL、X、BRT)=> btree_size BTL + 1 + btree_size BTR毎回。 reduce( "add it to" 0、bt) 私はちょうど1つずつ追加する方法を知らない。 – user559399

+0

私はあなたがすでにそれを理解したと思う。 btree_reduceに渡す関数fは3つの引数をとります。最初の引数と3番目の引数は、2つの再帰呼び出しの結果です。 btree_sizeの誘導の場合、結果はx + 1 + yの形式をとります。ここでx = btree_size btl、y = btree_size btrです。もっとヒントが必要ですか? –

+0

はい、私はそれを理解しています。私はそれを行うことを指示する削減するために渡す関数を作成する方法を知らない。私が試したことはすべて集計されていません。外部ヘルパー関数を作成する必要がありますか、これを行うためのSML機能が組み込まれていますか? – user559399