-5

最初に mem という関数を書きます。整数と整数のリストが与えられると、その整数がリストに少なくとも 1 回出現する場合は true を返し、それ以外の場合は false を返します。これは私の最初の質問であり、組み込み関数を使用したくありません。

私の 2 番目の質問: それぞれが引数として 2 つの整数のリストを取り、セットと見なされるリストの和集合と共通部分をそれぞれ返す 2 つの関数を作成します。おそらく、以前に定義されたメンバー関数を使用したいと思うでしょう。リストを並べ替える必要はありませんが、重複はできません。

組み込み関数なしでこれを解決する方法がわかりません 解決策はありますか?

4

1 に答える 1

1

F#を学習しようとしている場合は、StackOverflowで質問するのではなく、実際にF#を学習してみてください。ただし、どちらの質問も、コミュニティの他のメンバーに基本的なF#を実際に示すことができる合理的な質問のように聞こえるので、考えられる解決策をいくつか示します。

メンバーテストは、再帰関数として実装できます。trueアイデアは、リストを調べて、必要な値が見つかったら戻るというものです。別の値を見つけた場合は、リストの残りの部分を再帰的に処理する必要があります。最後に到達した場合(そして空のリストを見つけた場合)、false空のリストには(明らかに)探している値が含まれていないため、を返します。

let rec mem value = function
 | x::xs when x = value -> true
 | x::xs -> mem value xs
 | [] -> false

を使用してユニオンを実装する方法はmem?ユニオンには、最初のリストにまだ含まれていない(重複を作成したくない)他のリストのすべての要素とともに、1つのリストのすべての要素が含まれます。だから、union list []なりそうlistです。2番目のリストが空でない場合(x::xs)、要素xが最初のリストにあるかどうかを確認します。はいの場合はスキップし、そうでない場合は結果に追加します。

let rec union list1 list2 = 
  match list2 with
  | [] -> list1
  | x::xs when mem x list1 -> union list1 xs
  | x::xs -> x::(union list1 xs)

これは末尾再帰を使用していないため、最も効率的なソリューションではありませんが、最初は最も簡単なソリューションです。

于 2012-11-20T14:36:12.743 に答える