2017-12-15 20 views
0

パターンマッチング技術を使用して、リスト内のすべての要素のペアを再帰的にスワップする必要があります。したがって、[1, 2, 3, 4, 5][2, 1, 4, 3, 5]を返します。私が発見したパターンマッチングを使用してリスト内の要素のペアを交換する

2つのこと:

  • List.length:長さを返します。これは、偶数/奇数リストを処理するのに役立ちます。
  • List.nth:リストの指定された場所に値を戻します。
  • drop.(list, i):最初の要素が削除された後に値を返す。

これらの3つのことを使って、いくつかの再帰メソッドを見つけ出すことができますが、パターンマッチングの側面はわかりません。以下はパターンマッチングのない擬似コードです。

function(list): 
    var a = first on list 
    var b = second on list 

    // odd case 
    if(b = null | "") 
    { 
    list = drop.(list, 1) @ a 
    } 

    // even case 
    else if(b = "" & a = "") 
    { 
    list = list 
    } 

    // recursive case 
    else 
    { 
    list = function(drop.(list, 2) @ b @ a) 
    } 

これは、本質的に、リストをループペアを交換し、リストの末尾に(連結)それらを配置し、それがすべてのペアを経験してきたまで再帰的にこれを繰り返して開始することができます。

+0

興味深い宿題のような音です。あなたはそれをどのように解決しようとしていますか?おそらく、あなたは解決策に向かって努力を共有し、より焦点を絞った質問をすることができます。 –

+2

forループについて考えているなら、機能的に考えるのではなく、パターンマッチングに関して考えていません。確かにあなたの教科書には、パターンマッチングを使って定義されたリストの再帰関数の例があります。そのような例をエミュレートしてみてください。 –

+0

パターンマッチング関数から始めましょう。 'nth'や' take'や 'drop'ではなく、パターンだけがリストの最初の2つの要素を返します。 (2つ以下のときに何をすべきか考えてみましょう;あなたは1つ以上の節が必要です)。その後、残りのリストに再帰を追加します。 – molbdnilo

答えて

0

機能List.lengthList.nthList.dropはあなたの仕事を解決するかもしれないようですが、これはパターンマッチングを使用する目標には逆効果です。リストは代数的データ型であることを利用しているあなたをパターンマッチングでは、ソートの空のリストと短所の既存の前の要素をINGのための中置::オペレータの値コンストラクタ[]を生成

datatype 'a list = [] | :: of 'a * 'a list 

のように宣言しましたリスト(それは空でも同じ方法でも作成されます)だけでなく、パターンコンストラクタあなたが扱っているリストの種類を認識します。

例:整数のリストを取得し、それらを合計機能:

fun sum [] = 0 
    | sum (x::xs) = x + sum xs 

例: 2-タプルのリストを受け取り、2組の同様のリストを返す関数しかし、各2組の要素と交換:

fun swap [] = [] 
    | swap ((x,y)::xys) = (y,x)::swap xys 

例:整数であり、rの偶数サイズのリストを取る関数特に

fun addpairs (x::y::xys) = x + y :: addpairs xys 
    | addpairs [_x] = raise Fail "Odd-sized list" 
    | addpairs [] = [] 

、パターンはネストすることができる((x,y)::xys ~~「最初の要素が有する2組である少なくとも一つの要素を持つリスト:彼らはペアで加算されてきたリストをeturnsその最初の部分はxであり、第2部分はy "およびx::y::xys ~~"第1要素がx、第2要素がyである少なくとも2つの要素を含むリスト)、および順序(上から下への一致)は、パターンが重なっていても問題ありません(上のいずれにも該当しません)。

関連する問題