3

私は OCaml にまったく慣れていないので、基本に問題があります。私のプログラムでは、二重らせんの残りの半分を見つけるために、ヌクレオチドをその補数 (G -> C、C -> G、A -> T、T -> A) と一致させる必要があります。一般的な考え方は、DNA は 2 つの相補的なヘリックスで構成されており、それぞれがヌクレオチドの配列であるというものです。現在、二重らせんの残りの半分を計算しようとしています。

これまで、列挙型でヌクレオチドを表現し、1 つのヘリックスに対応するヌクレオチド リストで DNA を表現しました。

type nucleotide = 
| G 
| C 
| A 
| T

type helix = nucleotide list

let rec complementary_helix (x:helix): helix =
| [G] -> [C]
| [C] -> [G]
| [A] -> [T]
| [T] -> [A]
end

ここに何かが欠けていることは知っていますが、どうすればよいかわかりません。誰かが私を正しい方向に導くことができますか?

4

1 に答える 1

6

あなたは基本的に行方不明List.mapです:

let complement = function
| G -> C
| C -> G
| A -> T
| T -> A

let complementary_helix (x: helix) : helix =
    List.map complement x

(念のため、型を指定する必要はありません。OCaml が型を推測します。ドキュメント用に指定するのは良いスタイルですが、明らかな場合はそうではないかもしれません。)

編集

わかりました、これは問題を解決するために再帰を使用することになっている宿題の問題だと思います。

再帰の考え方は、問題の小さな部分を解決したいということです。これにより、解決する問題が小さくなります。小さな問題を自分自身に渡します (小さな問題を解決する前または後に)。また、問題が非常に小さくなり、それ以上の作業ができなくなったことを知る必要もあります。

あなたの場合、小さなピースは、1 つのヌクレオチドをその補体に変換することです。あなたはそのセミOKをやっています(本当に単一のヌクレオチドで作業したいリストがあります)。しかし、再帰的に解決するために、問題の残りの部分を自分自身に渡していません。また、問題が小さすぎて何もすることがないかどうかもチェックしていません。

リスト上の関数の場合、約 99% の確率で、リストをヘッド (単一要素) とテール (1 つ小さいリスト) に分割することで問題を小さくします。それはここであなたのために働くでしょう。

編集 2

リスト再帰がどのように見えるかの例として、リスト内のすべての整数を合計する関数を次に示します。

let rec sum l =
    match l with
    | [] -> 0
    | head :: tail -> head + sum tail

これには、私が説明したすべての部分があります。はmatch、問題が些細な場合 (リストが空の場合) を示したり、リストを先頭と末尾に分割したりするために使用されます。テールの合計 (再帰的に取得できる) があると仮定すると、答えは明らかです。この合計に頭を追加するだけです。あなたは自問する必要があります(ほとんどの場合):リストの末尾の答えがわかっている場合、それを頭と組み合わせるために何をする必要がありますか?

于 2013-01-27T05:01:13.457 に答える