二郎列表理解,排列

问题描述 投票:3回答:1

我是从一本书的排列例子修修补补。下面的代码按预期工作。

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

所以,我无法弄清楚两个表达式之间的差异。

erlang list-comprehension
1个回答
6
投票

此函数实现递归算法:

  • 什么是一个非空列表的排列?对于每一个在列表中的元素的,以列表减去该元素的置换和元件在前面加上每个这样排列。
  • 什么是空列表的排列?只有一个:空单本身,所以我们返回包含一个元素,即空列表清单:[[]]

通过改变基本情况返回,而不是[] [[]],你说:

  • 什么是空列表的排列?有零个排列。

然后在递归的情况下,你到了一步“走...的排列组合” - 但有没有排列,所以没有什么,你可以在前面加上元素。

© www.soinside.com 2019 - 2024. All rights reserved.