【问题标题】:Standard ML permutations标准 ML 排列
【发布时间】:2011-05-05 09:28:13
【问题描述】:

我正在研究列表中所有值的排列函数。

这是我目前所拥有的:

//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 函数以正确显示输出?任何帮助,无论大小,都会对我有很大帮助。

【问题讨论】:

    标签: smlnj ml sml


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我不认为轮换方法是您想要采用的方法。相反,作为Shivindap describes here,做这种事情的一个好方法是从参数列表中拉出第一个元素,并将其附加到尾部的所有排列中。 冲洗并重复列表中的每个元素,您将得到所有排列。

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

      祝你好运!

      【讨论】:

      • 谢谢,我会看看这个。
      猜你喜欢
      • 2016-06-11
      • 2015-04-05
      • 2012-03-22
      • 1970-01-01
      • 2017-11-30
      • 2017-06-25
      • 2014-04-02
      • 2017-11-23
      • 2012-04-14
      相关资源
      最近更新 更多