2010-11-05 124 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))