标准ML排列

时间:2010-11-05 00:23:43

标签: smlnj ml sml

我正在处理列表中所有值的排列函数。

这是我到目前为止所做的:

//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元素列表在这里出于某种原因。

如何更正我的烫发功能以正确显示输出?任何帮助,无论大小,都会对我有所帮助。

2 个答案:

答案 0 :(得分:4)

我不认为旋转方法是你想要采取的方法。相反,作为Shivindap describes here,执行此类操作的一种好方法是从参数列表中提取第一个元素,并将其附加到尾部的所有排列。 为列表中的每个元素冲洗并重复,您将最终获得所有排列。

您会找到这种方法的深入解释here。对于ML中的代码示例,您还可以check this out

祝你好运!

答案 1 :(得分:4)

以下是针对您尝试的解决方案的简单修复。你快到了。

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))