我真的需要这项任务的帮助,如下所示: 我需要使用map family实现这个功能。
mapSub(列表1,列表2)。
Subtracts List2 from List1
Follows the order of appearance in
List2.
Implement it using map family
Examples:
mapSub([1,2,3,4,5,1,2,3,4,5],[1,1,2]).
[2,3,4,5,3,4,5]
mapSub ([1,2,3,4,5,1,2,3,4,5],[1,1,2,2]).
[2,3,4,5,3,4,5]
问题是如何使用我允许使用的功能来管理List2,
例如,如果我找到List2中的第一个元素并删除他在List1中的第一个外观。
我该如何更换我寻找的元素
到List2尾部的头部(List2中的下一个元素)
谢谢。
答案 0 :(得分:0)
mapSub(L1, L2) ->
Inc = fun(X, Map) ->
Map#{X => maps:get(X, Map, 0) + 1}
end,
Map = lists:foldl(Inc, #{}, L2),
sub(L1, Map).
sub([], _) -> [];
sub([H|T], Map) ->
case maps:get(H, Map, 0) of
0 ->
[H | sub(T, Map)];
N ->
sub(T, Map#{H => N - 1})
end.
test() ->
L1 = [1,2,3,4,5,1,2,3,4,5],
ok = check(L1, [1,1,2]),
ok = check(L1, [1,1,2,2]).
check(L1, L2) ->
Expect = L1 -- L2,
case mapSub(L1, L2) of
Expect -> ok;
Error -> {error, [Expect, Error]}
end.
BTW您的示例结果是错误的,或者您的意思是减去而不是--
。
答案 1 :(得分:-1)
-module(wy).
-compile(export_all).
main() ->
L1 = [1,2,3,4,5,1,2,3,4,5],
L2 = [1,1,2],
[2,3,4,5,3,4,5] = mapSub(L1, L2),
[2,3,4,5,3,4,5] = mapSub([1,2,3,4,5,1,2,3,4,5],[1,1,2,2]).
mapSub(L1, L2) ->
mapSub(L1, L2, []).
mapSub([], _, Res) ->
lists:reverse(Res);
mapSub(L1, [], Res) ->
lists:reverse(Res) ++ L1;
mapSub([H1 | T1], [H1 | T2], Res) ->
mapSub(T1, T2, Res);
mapSub([H1 | T1], [H2 | _] = L2, Res) when H1 /= H2->
mapSub(T1, L2, [H1 | Res]).
您可以尝试使用此代码。
您的问题是典型的递归。