erlang 求子数组和的最大值

前段时间修改为简单方法

-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值