3

こんにちは、プログラミングは初めてで、学習と楽しみのために問題を抱えています。この時点で少し立ち往生しています..問題はからですIntroduction to Programming using Sml 5.9

リストを分割したい[x1, x2, x3, ... ,xn] = ([x1, x3,....], [x2, x4,...])

これは私がこれまでに作ったものです:

fun split [] =  []
  | split (x1::x2::x3::x4::xs) = ([x1, x3], [x2, x4])::split xs



val test1split = split [1, 1, 2, 3];

これから私は得ます:

[([1, 2], [1, 3])]....(リストを分割するタプルが必要ですが、これは明らかに必要ありません)

要素が4つを超える場合、関数は機能しません。リスト内の偶数要素と奇数要素を最初に並べ替えるヘルパー関数が必要なのかもしれません。誰かが私の心を正しい方向に追跡するのを手伝ってくれることを願っています。それまで私は努力を続けます。

4

2 に答える 2

4
fun split [] = ([], [])   
  | split [x] = ([x], [])  
  | split (x1::x2::xs) = 
               let 
                 val (ys, zs) = split xs
               in 
                ((x1::ys), (x2::zs))
              end;



val test1split = split [1, 1, 2, 3, 5, 6] = ([1, 2, 5], [1, 3, 6])
val test2split = split [8, 7, 6, 5, 4, 3] = ([8, 6, 4], [7, 5, 3])
val test3split = split [8, 7] = ([8], [7])
val test4split = split [8] = ([8], [])

解決しました...方法が完全にはわかりません笑、それをマスターするにはもっと多くの練習が必要です。ポインターなしではできなかったでしょう...ニック・バーンズの助けに感謝します。

于 2012-10-13T04:16:15.167 に答える
3

あまり多くを与えないようにしますが、ここにいくつかのヒントがあります:

  • 2つの基本ケースが必要です。1つは、、[]もう1つは[x]
  • あなたの一般的なケースは、4つではなく2つの要素を扱う必要があるだけです(最初のリストに1つ、2番目のリストに1つ入れます)
  • 現時点でsplitは、タプルではなくリストを返す必要があります。最初のベースケースの結果は次のようになります([],[])
  • 一般的なケースでは、再帰split xsはタプルを返し(ys,zs)ます。ysこれらの値を抽出し、、、、およびの観点から結果のタプルを作成する必要がありzsます。x1x2

(編集)改訂されたソリューションに関するいくつかのポイント:

  • 一度に処理する必要があるのは2つの要素だけです。一般的なケースは次のようになります。split x1::x2::xs
  • split [x,y]一般的なケースで処理されます-別のベースケースは必要ありません。
  • 再帰呼び出しがありません!出力の両方の半分に直接入れているため、要素は両方のリストに表示されますxs。最初に分割する必要があります。皮切りに
    let (ys, zs) = split xs in ...
于 2012-10-13T01:32:07.360 に答える