前段时间修改为简单方法
-module (son).
-export ([son/1]).
son(A) ->
son(A, 0, 0).
son([], Max, _Sum) ->
Max;
son([Head | List], Max, Sum) ->
New_Sum = Head + Sum,
New_max = case New_Sum > Max of
true ->
New_Sum;
_ -> Max
end,
New_Sum_1 = case New_Sum > 0 of
true ->
New_Sum;
_ -> 0
end,
son(List, New_max, New_Sum_1).
今天看见一题关于求子数组和的题目
就是数据中连续的数组成的数组[1, 2, 3, 4, 5] 子数组[1],[1, 2],[2,3,5]等。数组中可能有多个负数所以求子数组的最大值就必须对多个情况进行考虑,当我们使用其他语言的时候发现实现起来相对简单,而erlang只能单一赋值,这就给erlang的逻辑处理添加很多的麻烦,这是erlang的优点,可是有时却带来麻烦。
第一次发表,写了个小逻辑,感觉很繁琐,请高人指点。
-module(test).
-export([sun_list/1,sun_list_sum/3,sum/1,sun_list/3]).
sun_list(List) -> %%输入接口
Length = length(List),
%%生成length长度列表
LengthList=length_list(Length,List),
%%遍历所有列表
MaxList=sun_list(List,Length,LengthList,Length,[]),
io:format("MaxList is~p~n",[MaxList]),
lists:max(MaxList).
sun_list(_List,0,_LengthList,_Lenght2,MaxList) -> MaxList;
sun_list(List,Start,LengthList,Lenght2,MaxList)->
LengthListNext = lists:reverse(lists:sublist(LengthList,1,Lenght2-Start+1)),
Max = sun_list_sum(List,Start,LengthListNext),
sun_list(List,Start-1, LengthList,Lenght2,[Max|MaxList]).
length_list(0,List) ->
List;
length_list(Length,List) ->
length_list(Length - 1,[Length|List]).
sun_list(List,S,L) ->
ListNext = lists:sublist(List, S, L),
sum(ListNext).
sum(List) ->
Sum = lists:foldl(
fun(X,Sum) ->
X + Sum
end,
0 ,List
),
Sum.
sun_list_sum(List,Start,LengthList) ->
SumList=lists:foldl(
fun(X,Lists) ->
[sun_list(List,Start,X)|Lists]
end,
[],LengthList),
lists:max(SumList).
test:sun_list([1,2,3,5,7,(-1),(-1)]).
MaxList is[18,17,15,12,7,-1,-1]
18