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([]) ]])]].