Erlang列表理解,排列

时间:2019-02-04 11:40:00

标签: erlang list-comprehension

我正在修改一本书中的排列示例。以下代码按预期工作。

perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].

当我替换表达式时,它变为:

[ [1 | perms([2])], 
   [2 | perms([1])] ]

[ [1 | [[2 | perms([])]]], 
   [2 | [[1 | perms([])]]] ]

[ [1 | [ [2 | [[]] ] ]], 
  [2 | [ [1 | [[]] ] ]] ]

这正确评估为[[1,2],[2,1]]。

但是当我将基本情况从一个列表更改为一个空列表时,它包含一个空列表:

perms([]) -> [];

它返回一个空列表。当我代替我得到这个。

   [ [1 | [[2 | [] ]]], 
     [2 | [[1 | [] ]]] ] 

我尝试将两个表达式都拉平,但是它们产生了相同且正确的结果。

[[1 | lists:flatten([[2 | lists:flatten([[]]) ]])], [2 | lists:flatten([[1 | lists:flatten([[]]) ]])]]
[[1 | lists:flatten([[2 | lists:flatten([]) ]])], [2 | lists:flatten([[1 | lists:flatten([]) ]])]].

所以我无法弄清楚两个表达式之间的区别。

1 个答案:

答案 0 :(得分:6)

此函数实现了递归算法:

  • 非空列表的排列是什么?对于列表中的每个元素,请减去列表的元素减去该元素,然后将该元素添加到每个这样的元素之前。
  • 空列表的排列方式是什么?只有一个:空列表本身,因此我们返回一个包含一个元素的列表,即空列表:[[]]

通过更改基本大小写以返回[]而不是[[]],您的意思是:

  • 空列表的排列方式是什么?排列为零。

然后在递归的情况下,执行步骤“获取...的排列”-但是没有排列,因此您可以在元素之前添加任何内容。