2016-06-29 14 views
1

私はocamlにはかなり新しく、この機能では苦労していますこのocaml再帰関数はどのように機能しますか?

私はそれが何であるかを知っています。指定されたリストでは、リストの最小値とリストの残りの値をペアとして返します。

sepmin [2; 1; 3; 4] ==(1、[2; 3; 4])

ヴァルのsepmin: 'リスト - >' *「リスト

# let rec sepmin = function 
[h] -> h, [] 
|h::t -> let h1, t1 = sepmin t in 
    min h h1, (max h h1)::t1;; 

あなたは再帰部分で私を助けてもらえますか

答えて

1

まず、リストの末尾に再帰的に適用されます。つまり、末尾の最小値と末尾のすべての他の要素であるh1t1を返します。次に、この要素hh1と比較します。 h1より小さい場合は、(h, h1::t1)のペアが返されます。それ以外の場合は(h1, h::t1)のペアが返されます。関数は再帰的に呼び出されるので、おそらくこれらの対のうちの1つが前の再帰点に戻されます(最初の要素は再びその点のリストの先頭と比較されます)。私が見る限り、この関数は要素の元の順序をあまり気にしません。すなわち、リスト[1; 4; 2; 5; 6]の場合は(1, [2; 4; 5; 6])を返さなければなりません.2と4は結果に並べ替えられます。

+0

私はそれを得ると思います!リストが[1; 2; 3]であった場合、最後の呼び出しはsepmin [3]、3、[]をh1、t1とし、sepmin [2,3]とsepmin [1; 2; 3]計算された?私が正しければ私に教えてください、そして、あなたにとても感謝してください^^ – deko

+0

はい、間違いなくその方法。 :) – bipll

0

再帰について考える良い方法は、2つの部分でそれを取ることです。まず、入力が些細なときに関数は何をしますか?小規模な入力に対して関数が機能すると仮定すると、大きな入力に対してはより大きな入力をどのように変換し、小文字の場合は答えを使用して大文字の場合の正しい結果を計算します(これは難しい部分です)。

この関数の簡単な例は、1つの要素のリストです。その場合の答えは明らかです。

長いリストの場合、リストの末尾に正しい答えを得るために再帰的な力を使うことができます(これは短いリストなので、再帰は仮定で動作します)。リストの末尾の答えを知ったら、リスト全体の正解を構成することができます。リストの頭の最大値と末尾の答えは全体の最大値です。これらの2つの値のうち小さい方をリストに追加する必要があります。

+0

あなたの返信ありがとうJeffrey、私はあなたが言っていることをよく理解していると思います。次回は関数を理解したり作成したりする必要があります。 – deko

関連する問題