我想知道如何将给定列表拆分为两个列表,以使两个列表具有相同的总和。我想通过使用并发来做到这一点。我在erlang做这个。将列表拆分成2个等于erlang的列表
所以,我正在做这样的事情: 阅读列表,如果它的总和是偶数,那么继续否则失败。获取列表的第一个元素,并检查它是否大于总和的一半,如果不是,则将该元素添加到新列表中。接下来,我将列表的第二个元素,检查这个元素和新列表的总和,并执行相同的操作。等等。这样,当新列表中的总和等于第一个列表总和的一半时,它会调用另一个函数发送其余元素。
-module(piles_hw).
-compile(export_all).
start([]) -> 0;
start(List) ->
Total = lists:foldl(fun(X, Sum)-> X+Sum end,0,List),
if (Total rem 2) == 0 ->
Total/2,
copy_to_list_one([],List,start(List));
true ->
func_fail()
end.
copy_to_list_one(L1,[H|T],X)->
Y =lists:sum(L1)+H,
if Y<X ->
copy_to_list_one(lists:append(L1,[H]),lists:delete(H,[H|T]),X);
Y==X ->
take(lists:append(L1,[H]));
Y>X ->
copy_to_list_one(L1,lists:delete(H,[H|T]),X)
end;
copy_to_list_one(L1,[],X)->
copy_func_two([1,2,3,4,19,20,28,14,11],X).
copy_func_two([H|T],X)->
copy_to_list_one([],lists:append(T,[H]),X).
take(L3)->
io:format("~w",[L3]).
func_fail() ->
io:format("~n fail ~n").
但是,这样我有时会进入一个无限循环。有人可以帮忙吗?
你能告诉我们你到目前为止的代码吗? – 2014-10-02 00:15:38
-module(piles_hw)。编译(export_all)。 start([]) - > 0; 开始(列表) - > NUMS(长度(列表)), %def_list(列表), 总计=列表:与foldl(乐趣(X,和) - > X +萨姆端,0,列表), if(Total rem 2)== 0 - > \t Total/2, \t copy_to_list_one([],List,start(List)); \t \t true - > \t func_fail() end。 数量(l) - > l。 copy_to_list_one(L1,[H | T],X) - > Y =列表:总和(L1)+ H, 如果Y \t copy_to_list_one(列表:追加(L1,[H]),列表:删除(H,[H | T])中,X); Y == X - > \t take(lists:append(L1,[H])); Y> X - > \t copy_to_list_one(L1,lists:delete(H,[H | T]),X) end; –
2014-10-02 00:22:55
请更新您的问题并在那里添加代码。如果使用四个空格缩进,则可以使用代码块,以便代码更具可读性。 – 2014-10-02 00:24:02