【问题标题】:Split An Erlang List, X, into a List of All X's Sublists将 Erlang 列表 X 拆分为所有 X 子列表的列表
【发布时间】:2011-05-26 05:35:31
【问题描述】:

lists:sublist/2lists:sublist/3 使得从列表中提取单个子列表变得简单,但是是否有一个 BiF 或模块可以返回列表的所有子列表的列表?

lists:awesome_sublist_function([1,2,3,4]) ->
  [[1], [2], [3], [4], [1,2], [1,3], [1,4], 
  [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4], [2,3,4], [1,2,3,4]]

可以自己构建,但想知道问题是否在任何地方都已解决?

【问题讨论】:

  • 不,但它应该很容易编写。看起来像是 list:unfold/4 的工作 - 不幸的是它还不存在。

标签: list erlang sublist


【解决方案1】:

我假设您的测试用例忘记了 [1,3,4],但它可能看起来像这样:

-module(settheory).
-export([combinations/1]).

combinations([]) ->
    [];
combinations([H | T]) ->
    CT = combinations(T),
    [[H]] ++ [[H | L] || L <- CT] ++ CT.

-include_lib("eunit/include/eunit.hrl").
combinations_test() ->
    ?assertEqual(
       combinations([1,2,3,4]),
       lists:sort([[1], [2], [3], [4], [1,2], [1,3], [1,4],
                   [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4],
                   [2,3,4], [1,2,3,4]])),
    ok.

【讨论】:

  • 当然可以,谢谢! (是的,我错过了 [1,3,4] - 现在添加到问题中)。我要离开并考虑一个尾递归版本。
  • 除了好玩之外我不会花太多时间做这个,效率上的差异可能不会很大。
  • 你是对的。速度方面,即使在大型列表中也没有太大区别。堆栈也没有太大区别 - 我想知道这是否是因为结果只会被附加。在 24 个项目的列表中,重复一百次,尾调用版本的中位数更小,范围更窄,但与平均值没有真正的差异。 (虽然很有趣 :))。
  • 在 eunit 断言宏中,您应该将预期值作为第一个参数添加到断言宏中,您要测试的值是最后一个参数。这使得输出消息更好。
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 2020-10-01
  • 2014-07-07
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 2018-12-08
相关资源
最近更新 更多