2016-10-15 10 views
0

((6,3,2)、(4,5,1))などのトリプルのペアをインターリーブし、このインターリーブから6タプルを作成する関数を作成しようとしています。 私はいくつかの調査をしましたが、インターリーブがどのように動作するのか理解できました。私自身の目的で何かを試してみましたが、6タプルを作成していますが、正しいインターリーブではありません。これは私のコードですOCamlでのインターリーブ

let interleave ((a, b, c), (a', b', c')) = 
let sort2 (a, b) = if a > b then (a, b) else (b, a) in 
let sort3 (a, b, c) = 
let (a, b) = sort2 (a, b) in 
let (b, c) = sort2 (b, c) in 
let (a, b) = sort2 (a, b) in 
(a, b, c) in 
let touch ((x), (y)) = 
let (x) = sort3 (x) in 
let (y) = sort3 (y) in 
((x),(y)) in 
let ((a, b, c), (a', b', c')) = touch ((a, b, c), (a', b', c')) in 
(a, b', a', b, c, c');; 

私はどのような機能を使って適切なインターリーブ形式を実現できるか教えてください。なぜこのようにしようとしているのか尋ねる場合に備えて、再帰とリストについて学んだことはありません。 ありがとうございました。

+0

私はあなたがしようとしていることを理解していません。私には「interleave」とは、「interleave((a、b、c)、(a '、b'、c '))=(a、b、b'、c、c ');; ';しかし、あなたのコードからは、それ以上のことをしようとしていることは明らかです。あなたはあなたの機能にどのような振る舞いを持たせたいのか正確に説明できますか? – ruakh

+0

正直言って私は迷っています。上で述べたように、インターリーブにはある種のパターンがあると思いました。私は与えられた記述を誤解したと思う。このようなものでした。「トリプルの場合にペアを使用して作成できる最大値を表す6タプルを形成する関数です。だから、私は2つのトリプルから最大値を作成しようとしている。私は今明らかに私は非常に混乱していることを願っています。ありがとう –

答えて

2

問題文では、「max」という単語を定義せずに使用します。 OCamlの組み込み関数compareを定義として使用する場合は、lexicographic orderが使用されます。したがって、6タプルの最初の位置にある(6つの値のうち)最大の値、次に2番目に大きな値などが必要です。

タプルの並べ替えでこれまでに確立されていたスキルを考えれば、これはかなり簡単です。

2つの3タプルのアイデンティティを保持することには価値がないようです。一番外側の関数の内部に入ると、6つの値を6つのタプルとして扱うことができます。それは私のように見えるかもしれません。

更新

あなたの例から、(おそらくそれはあなたがするように頼まれているものはかなり明らかだ:-)最初にそれを与えているはずです。元のタプルの要素が元の順序になっているシーケンスで終了したいが、それらは任意にインターリーブすることができます。これはしばしば「シャッフル」(またはマージ)と呼ばれます。あなたはlexicographically最大値を持つシャッフルを見つける必要があります。

これを推測すると、2つのタプルの正面から最も大きな値をとり、次の出力に配置します。

これはです。多くはリストでやりやすくなっています。

+0

(6、4、5、3、2、1) "645321"は(6,3,2)および(4,5,1)から得られる最大数です。 )。したがって、第1位に最大値を置き、注文に従うことは機能しません。上記のことから、後者のタプルの1桁目と2桁目を最初の要素と比較して、その順序でソートする必要があります。私はif文でその作業を行うことができると思います。 –

+0

ああ、これは「インターリーブ」のためです。わかった。私は私の答えを更新します。 –

+0

ありがとうございました。 (a '、a、b、c、b')の場合には、a '= a'ならば、 (a '、b'、a、b、c、c ')else(a'、b '、a'、b '、c' (a '、b'、a '、b'、c '、a'、b '、b'、c ' c、c ') 'または間違った海で泳ぐ? :-D –

2

私はあなたの最終目標が何であるか理解しました。 。 。

n個要素のタプルが異なるN年代ごとに異なるタイプなので、あなたはタプルの異なるサイズを操作するためのヘルパー関数を定義する必要があります。先頭に追加

  • 機能:基本的にはリスト上の再帰関数を模倣する(ただし、すべての種類が異なるため、タプルの多くの余分な機能を必要とする)こと

    一つのアプローチは、ヘルパー関数の2セットを持っていることです値は既存のタプル:prepend_to_2、最大でprepend_to_5までです。 interleave_1_1interleave_1_2interleave_1_3interleave_2_2interleave_2_3、及びinterleave_3_3:3のそれぞれの可能なサイズまでの2つのタプルをインタリーブ例えば、

    let prepend_to_3 (a, (b, c, d)) = (a, b, c, d) 
    
  • 機能します。 (例えば、interleave_2_1、(あなたはそれがどのように動作するかを参照していますか?))。私達はちょうど逆の順序で引数を持つinterleave_1_2を呼び出すことができるので、例えば、

    let interleave_2_2 ((a, b), (a', b')) = 
        if a > a' 
        then prepend_to_3 (a, interleave_1_2 (b, (a', b'))) 
        else prepend_to_3 (a', interleave_1_2 (b', (a, b))) 
    

その後interleaveはちょうどinterleave_3_3です。

リストと再帰を使用すると、単一の関数が任意の長さのリストに対して操作できるため、同じロジックの複数の異なるコピーを必要としないので、これははるかに簡単です。