找到所有可能的对
Find all possible pairs
我正在处理一些 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))).
您可以使用列表理解并将同一个列表引用两次作为输入:
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}]
我正在处理一些 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))).
您可以使用列表理解并将同一个列表引用两次作为输入:
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}]