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]]。如您所见,我在这里遗漏了一些东西。我相信问题是我的 3 没有被传递给旋转,因为旋转 3 [1,2] 是我的代码中缺少的内容,并且由于某种原因这里有两个 2 元素列表。

如何更正我的 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 回答