Erlang 列表理解、排列
Erlang list comprehension, permutations
我正在修改一本书中的排列示例。以下代码按预期工作。
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([]) -> [];
它returns 是一个空列表。当我替换时,我得到了这个。
[ [1 | [[2 | [] ]]],
[2 | [[1 | [] ]]] ]
我用 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([]) ]])]].
所以我无法弄清楚两个表达式之间的区别。
这个函数实现了一个递归算法:
- 非空列表的排列是什么?对于列表中的每个元素,采用列表的排列减去该元素并将该元素添加到每个这样的排列中。
- 空列表的排列是什么?只有一个:空列表本身,所以我们return一个包含一个元素的列表,即空列表:
[[]]
通过将基本案例更改为 return []
而不是 [[]]
,您是说:
- 空列表的排列是什么?排列为零。
然后在递归的情况下,您将进入步骤 "take the permutations of..." - 但没有排列,因此您无法将元素添加到任何内容。
我正在修改一本书中的排列示例。以下代码按预期工作。
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([]) -> [];
它returns 是一个空列表。当我替换时,我得到了这个。
[ [1 | [[2 | [] ]]],
[2 | [[1 | [] ]]] ]
我用 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([]) ]])]].
所以我无法弄清楚两个表达式之间的区别。
这个函数实现了一个递归算法:
- 非空列表的排列是什么?对于列表中的每个元素,采用列表的排列减去该元素并将该元素添加到每个这样的排列中。
- 空列表的排列是什么?只有一个:空列表本身,所以我们return一个包含一个元素的列表,即空列表:
[[]]
通过将基本案例更改为 return []
而不是 [[]]
,您是说:
- 空列表的排列是什么?排列为零。
然后在递归的情况下,您将进入步骤 "take the permutations of..." - 但没有排列,因此您无法将元素添加到任何内容。