-1

次のように進むこの割り当てについて本当に助けが必要です:マップファミリーを使用してこの機能を実装する必要があります。

mapSub(List1,List2)。

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 から最初の要素を見つけて、List1 の最初の要素を削除した場合など、使用を許可した関数で List2 を管理する方法です。
探している要素
を List2 の末尾 (List2 の次の要素) の先頭に置き換えるにはどうすればよい
ですか。

4

2 に答える 2

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.

ところで、例の結果が間違っているか、減算によってまったく異なることを意味します--

于 2016-04-28T12:51:04.943 に答える
-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]).

このコードを試すことができます。

あなたの問題は典型的な再帰です。

于 2016-04-28T01:40:37.107 に答える