【问题标题】:Find all possible pairs找到所有可能的对
【发布时间】:2016-02-25 10:19:33
【问题描述】:

我正在编写一些 erlang 代码,并希望创建一个递归函数来从列表中提取所有可能的对。该列表可以有零个元素,但最多可以有 70 个元素。为所有这些事件编写案例是不好的做法,我希望得到您的帮助。

pair(List) ->
    case List of
        []              -> [];
        [A]             -> [{A}];
        [A, B]          -> [{A, B}, {B, A}];
        [A, B, C]       -> [{A, B}, {A, C}, {B, A}, {B, C}, {C, A}, {C, B}];
    end.

我发现编写了一个函数来创建所有可能组合(不仅是所有对)的列表,但我不明白如何更改它。

combos(1, L) -> [[X] || X <-L];
combos(K, L) when K == length(L) -> [L];
combos(K, [H|T]) ->
    [[H | Subcombos] || Subcombos <- combos(K-1, T)]
    ++(combos(K, T)).

combos(L) ->
    lists:foldl(
        fun(K, Acc) -> Acc++(combos(K, L)) end,
        [[]], lists:seq(1, length(L))).

【问题讨论】:

    标签: list recursion erlang tuples


    【解决方案1】:

    您可以使用列表推导式并将同一个列表作为输入引用两次:

    1> L = [a,b,c,d].
    [a,b,c,d]
    2> [{X, Y} || X <- L, Y <- L].
    [{a,a},
     {a,b},
     {a,c},
     {a,d},
     {b,a},
     {b,b},
     {b,c},
     {b,d},
     {c,a},
     {c,b},
     {c,c},
     {c,d},
     {d,a},
     {d,b},
     {d,c},
     {d,d}]
    

    如果有任何更清晰的更有效的方法来做到这一点,我会感到惊讶。

    编辑

    如果您不想要相同的对({a,a} 等),您可以添加保护以确保不相等:

    5> [{X, Y} || X <- L1, Y <- L1, X /= Y]. 
    [{a,b},
     {a,c},
     {a,d},
     {b,a},
     {b,c},
     {b,d},
     {c,a},
     {c,b},
     {c,d},
     {d,a},
     {d,b},
     {d,c}]
    

    【讨论】:

    • 谢谢!这就是我想要的,除了具有相同变量的对(即{a,a},{b,b}等)。有没有办法在列表理解中使用守卫?
    • @Oscar 当然,保证不平等的最后一个守卫会成功。
    猜你喜欢
    • 2022-11-22
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多