0

リスト内のすべての値の順列に対する関数に取り組んでいます。

これが私がこれまでに持っているものです:

//MY ROTATE FUNCTION

fun rotate e [] = [[e]]
| rotate e (x::xs)= (e::x::xs)::(List.map (fn l => x::l) (rotate e xs));

//MY CURRENT PERMUTATION FUNCTION

fun perm [] = []
| perm (x::xs) = List.concat(List.map (fn l => (rotate x xs)) xs) @ perm xs;

出力:

- perm [1,2,3];

val it = [[1,2,3],[2,1,3],[2,3,1],[1,2,3],[2,1,3],[2,3,1],[2,3],[3,2]]

出力は、[[1、2、3]、[1、3、2]、[2、1、3]、[2、3、1]、[3、1、2]、[3、 2、1]]。ご覧のとおり、ここで何かが足りません。問題は、rotate 3 [1,2]がコードから欠落しているものであり、2つの2要素リストが何らかの理由でここにあるため、私の3がrotateに渡されていないことだと思います。

出力を正しく表示するようにperm関数を修正するにはどうすればよいですか?どんなに大きくても小さくても、どんな助けでも私を大いに助けてくれるでしょう。

4

2 に答える 2

5

これがあなたの試みた解決策の簡単な修正です。あなたはもうすぐそこにいました。

fun interleave x [] = [[x]]
| interleave x (h::t) =
    (x::h::t)::(List.map(fn l => h::l) (interleave x t))

fun permute nil = [[]]
| permute (h::t) = List.concat( List.map (fn l => interleave h l) (permute t))
于 2011-04-12T06:21:33.497 に答える
4

ローテーションアプローチはあなたが取りたいと思うものではないと思います。むしろ、Shivindapがここで説明しているように、この種のこれを行う良い方法は、引数リストから最初の要素を引き出し、それをテールのすべての順列に追加することです。リストのすべての要素に対してこれをすすぎ、繰り返します。そうすれば、すべての順列ができあがります。

このアプローチの詳細な説明はここにあります。MLのコードサンプルについては、これを確認することもできます。

幸運を祈ります!

于 2010-11-06T19:41:33.583 に答える