【发布时间】:2014-11-26 22:59:35
【问题描述】:
我想知道如何将给定列表拆分为两个列表,以使两个列表具有相同的总和。我想通过使用并发来做到这一点。我正在用 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").
但是,这样我有时会陷入无限循环。有人可以帮忙吗?
【问题讨论】:
-
你能告诉我们你到目前为止的代码吗?
-
-模块(piles_hw)。 -编译(export_all)。开始([])-> 0; start(List) -> nums(length(List)), %def_list(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() 结束。数字(l)-> l。 copy_to_list_one(L1,[H|T],X)-> Y =lists:sum(L1)+H, 如果 Y
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; -
请更新您的问题并在此处添加代码。如果您使用四个空格缩进,则可以使用代码块,这样您的代码就更具可读性。
-
我编辑了我的问题。
-
当无法构造两个相等值的列表时,需要什么返回值?