我正在修改一本书中的排列示例。以下代码按预期工作。
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([]) ]])]].
所以我无法弄清楚两个表达式之间的区别。
答案 0 :(得分:6)
此函数实现了递归算法:
[[]]
通过更改基本大小写以返回[]
而不是[[]]
,您的意思是:
然后在递归的情况下,执行步骤“获取...的排列”-但是没有排列,因此您可以在元素之前添加任何内容。