我是从一本书的排列例子修修补补。下面的代码按预期工作。
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([]) ]])]].
所以,我无法弄清楚两个表达式之间的差异。
此函数实现递归算法:
[[]]
通过改变基本情况返回,而不是[]
[[]]
,你说:
然后在递归的情况下,你到了一步“走...的排列组合” - 但有没有排列,所以没有什么,你可以在前面加上元素。