2011-03-08 10 views
2

私はこのような関数の構築に関して質問があります。ocamlreの2つの配列の間で関数を構築する反復

list1.(0) -> list2.(0) 
list1.(1) -> list2.(1) 
... 
list1.(n-1) -> list2.(n-1) 

はどのようにそれを行うには:ここでは

、私は2つのリストを持って、両方が同じ長さを持つ(長さがnある、と私はしたい場合は、この要件を満たす機能であることを言うの?関数内で反復処理を行う必要がありますか?または2つの関数を追加する必要がありますか?このようなものに答えるには、微妙な方法が必要です。

申し訳ありませんが、実際にはかなり簡単です。私は簡単にnlucaroniによって書かれた関数fを作成することができます。

let rec f domain range x = 
match (List.hd domain) = x with 
    | true -> (List.hd range) 
    | false -> f (List.tl domain) (List.tl range) x;; 
+0

あなたは明確にしようとすることができます:

let rec f domain range x = match domain, range with | k::_, v::_ when k = x -> v | _::ks, _::vs -> f ks vs x | _ -> raise Not_found;; 

別のアプローチは、標準ライブラリ関数を使用することであろうか?私はあなたが構築したい機能を理解していません - それは同じ長さの2つのリストを超えているということだけです。 – akoprowski

+0

OCamlではリストと配列が完全に異なっていることを認識しています。 – nlucaroni

+0

@akoprowski:list1のn番目の引数が入力であれば、list2のn番目の引数を返します。さらに、この関数を別の関数の引数として使用します。 – zfm

答えて

2

私の理解から、2つの配列があります。 1つは関数の領域を定義し、もう1つは範囲を定義します。そして、この関数を表すocaml関数を記述したいとします。私は関数が全単射であるとここで仮定しています。欠けている部分である肉は、配列内の要素のインデックスを見つける関数です。 List.findの精神で、この比較を定義する関数を渡すことにしました。

let find_index p array = 
    let rec find_index idx = 
     if idx = (Array.length array) then raise Not_found 
     else if (p array.(idx)) then idx 
     else find_index (idx+1) 
    in 
    find_index 0 

ここからは、関数を作成するのは簡単であり、その逆の、あなたはデータのほんの小さなセット、より多くの上でこれを使用する予定がある場合

let f domain range x = range.(find_index (fun y -> 0 = compare x y) domain) 
let f' domain range y = domain.(find_index (fun x -> 0 = compare x y) range) 

は良い方法があります。実際には、Mapの実装は不良です。これはO(n)ルックアップを持ち、マップはO(log(N))を持ちます。私はあなたが代替案に興味を持っていないかもしれないことを理解しているので、私はそれに私の推薦を残すでしょう。あなたは危険な機能List.hdList.tlを使用する必要がないように

+0

ありがとうございます。私は私のコードでパラメータとしてfを使用する必要があるので少し変更します。 – zfm

+0

私のデータはそれほど大きくはないので、複雑さをO(n)からO(log(n))に変更してもあまり影響はありません。いずれにせよ、O(n)は依然として扱いやすいです。 – zfm

+0

投稿が更新されました!私はちょうどこれが実際にはかなり簡単であることに気付いた。 – zfm

2

は、あなたが知っているif表現があり、リストやその他のデータ構造のためmatch式を保存!例えば、あなたのコードは、に書き換えて(ETA:おっと、再帰呼び出し忘れた):

let f domain range = 
    let map = List.combine domain range in 
    fun x -> List.assoc x map;; 
関連する問題