我想知道如何將給定列表拆分爲兩個列表,以使兩個列表具有相同的總和。我想通過使用併發來做到這一點。我在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