【问题标题】:Erlang list comprehension, permutationsErlang 列表理解,排列
【发布时间】:2019-02-04 19:48:52
【问题描述】:

我正在修改书中的一个排列示例。以下代码按预期工作。

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 | [] ]]] ] 

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

所以我无法弄清楚两个表达式之间的区别。

【问题讨论】:

    标签: erlang list-comprehension


    【解决方案1】:

    这个函数实现了一个递归算法:

    • 非空列表的排列是什么?对于列表中的每个元素,将列表的排列减去该元素,然后将元素添加到每个这样的排列中。
    • 空列表的排列是什么?只有一个:空列表本身,所以我们返回一个包含一个元素的列表,即空列表:[[]]

    通过将基本情况更改为返回 [] 而不是 [[]],您的意思是:

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

    然后在递归的情况下,您将进入“对...进行排列”的步骤 - 但没有排列,因此您无法添加任何元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多