2017-02-23 3 views
0

次のようにバイナリツリーは、型「のocamlのツリーを持っている:私は、入力として文字列のツリーを取る関数t_charcountを書いて、合計数をカウントする方法をバイナリツリーの文字カウントと連結

type 'a tree = Leaf of 'a 
     | Fork of 'a * 'a tree * 'a tree 
let t3 = Fork ("Hello", Leaf "World", Leaf "!") 

を値に含まれる文字の数。関数の型は:string tree - > intです。

t_charcount t3 gives int = 11. 

はどうやって機能を記述します。

は一緒に文字列ツリーの値を連結する関数のt_concatを書きます。この関数の型は次のとおりです。文字列の木 - >文字列

t_concat t3 gives string = "HelloWorld!". 

答えて

1

どのように私は、入力として文字列のツリーを取る関数t_charcountを書いて、値が

が含まれている文字の合計数をカウントします

構造誘導を使用する - 基本ケース(たとえば、葉ノードの文字数)を考え、Forkノードの左右のサブツリーからどのように結果を結合するかを考えれば、これは一般的なスケルトンです:

let t_charcount tree = 
    let rec loop tree sum = match tree with 
    | Leaf x -> ...base case... 
    | Fork (x,t1,t2) -> ...induction case.. in 
loop tree 0 

文字列ツリーの値を連結する関数t_concatを作成します。この関数の型は次のとおりです。文字列の木 - >文字列

あなたは、あなたは、文字列で結果を蓄積連結演算子を使用しなければならない代わりに、整数で結果を蓄積する以外、 charcount機能と同じアプローチを使用する必要があります

^

P.S.期待しないで、人々はあなたの宿題をします。

+0

文字数をカウントするのにString.length関数を使用する必要がありますか?私は必然的にヘルパー機能が必要ですか?また、「和」の使い方がわからないのですか? – user3460123

+0

合計は、ツリー上の文字の総数を累積する関数パラメータの任意の名前です。もちろん、String.length関数を使用する必要があります。 – ivg