Erlang列表理解、排列

Erlang列表理解、排列,erlang,list-comprehension,Erlang,List Comprehension,我正在修改一本书中的排列示例。以下代码按预期工作 perms([]) -> [[]]; perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])]. 这正确地计算为[[1,2],[2,1]] 但当我将基本情况从包含空列表的列表更改为空列表时: perms([]) -> []; 它返回一个空列表。当我得到这个 [ [1 | [[2 | [] ]]], [2 | [[1 | [] ]]] ] 我用flat

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

perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].
这正确地计算为[[1,2],[2,1]]

但当我将基本情况从包含空列表的列表更改为空列表时:

perms([]) -> [];
它返回一个空列表。当我得到这个

   [ [1 | [[2 | [] ]]], 
     [2 | [[1 | [] ]]] ] 
我用flatte尝试了这两种表达,但它们得到了相同且正确的结果

[[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 | lists:flatten([[2 | lists:flatten([[]]) ]])], [2 | lists:flatten([[1 | lists:flatten([[]]) ]])]]
[[1 | lists:flatten([[2 | lists:flatten([]) ]])], [2 | lists:flatten([[1 | lists:flatten([]) ]])]].