2010-11-05 76 views
0

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

这是我到目前为止有:

//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; 

OUTPUT:

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

如何纠正我的烫发功能以正确显示输出?任何帮助无论大小会帮助我很多。

回答

4

我不认为旋转的方法是你想要的。相反,如Shivindap describes here所示,这样做的一种好方法是从参数列表中拉出第一个元素,并将其附加到尾部的所有排列中。 冲洗并重复这个列表的每一个元素,你会最终得到所有的排列。

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

祝你好运!

+0

谢谢我会看看这个。 – user494948 2010-11-07 18:03:47

3

下面是您尝试解决方案的简单修复方法。你快到了。

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