【发布时间】:2020-09-28 09:43:52
【问题描述】:
我正在尝试用函数式编程语言自学一些编程,最近偶然发现了从长度为 n 的列表中生成所有长度为 m 的排列的问题,与 重复。从数学上讲,这应该导致总共有n^m 可能的排列,因为每个m 'slots' 都可以用任何n 元素填充。然而,我目前拥有的代码并没有 给我所有的元素:
let rec permuts n list =
match n, list with
0, _ -> [[]]
| _, [] -> []
| n, h :: t -> (List.map (fun tt -> h::tt) (permuts (n-1) list))
@ permuts n t;;
该算法基本上从具有m 元素的列表中取出一个元素,将其与其余元素放在所有组合的前面,并将结果连接到一个列表中,仅给出n C m 结果。
例如,permuts 2 [1;2;3] 的输出结果
[[1;1]; [1;2]; [1;3]; [2;2]; [2;3]; [3;3]]
而我真正想要的
[[1;1]; [1;2]; [1;3]; [2;1]; [2;2]; [2;3]; [3;1]; [3;2]; [3;3]]
——一共9个元素。如何修复我的代码以获得所需的结果?任何指导表示赞赏。
【问题讨论】:
-
AFAIK 您的示例在 OCaml 中。为什么要添加 haskell 和 scala 标签?
-
关于似乎是输入列表的 N 次方笛卡尔积的 Haskell 版本,您可以查看 closely related SO question。如果事情没有按正确的顺序调用,请注意过多的内存消耗。
-
对不起,我是新手。我添加了网站建议的所有标签,但我删除了不相关的标签
标签: functional-programming ocaml permutation