代码:
-module(my_max).
-export([get_max/1]).
get_max(L) ->get_max(L, 0, 0).
get_max(L, M, Nm) ->
case cal_max(L, M, Nm) of
{_, Tm, []} -> get_max_l(Tm, Nm);
{1, Tm, T} -> get_max(T, Tm, Nm); %此处有bug,Nm值修改为Tm与Nm之间的最大值即可:get_max(T,Tm,get_max_l(Tm,Nm)); 但是这个时候代码看起来好丑= =!
{0, Tm, T} -> get_max(T, 0, Tm)
end.
cal_max(L, M, Nm)->
case get_head(L) of
{H, []} -> switch_max(H, M, Nm, []);
{H, T} ->switch_max(H, M, Nm, T)
end.
switch_max(H, M, Nm, T)->
if
H + M >= 0 -> {1, H + M, T};
true -> get_max_n(M, Nm, T)
end.
get_max_n(M, Nm, L) ->
{0, get_max_l(M,Nm), L}.
get_max_l(Tm, Nm) ->
if
Tm > Nm -> Tm;
true -> Nm
end.
get_head(L) ->
[H|T] = L,
{H, T}.
函数名有点丑。。实在是想不出这个函数该叫啥。。函数只返回了最大值,如果需要最大序列的话,可以把M和Nm改成State的record,每次更新record的对应内容就好了
(好像还是存在一个bug,如:[3,-1,-1],这个状态要怎么记录?难道这个问题只能把结果全部计算出来然后取出最大值么?有空看看动态规划再想想。。
啊,有了,每次计算出当前最大值后,多与历史值比较并确认是否更新历史值。。也就是让历史值一直是最大值就可以了。。已更新,在注释中。。)
逻辑如下:
1.取出第一个元素,并将该元素与已计算最大值M求和
a.值大于0,该值作为当前计算的最大值返回
b.值小于0,将已计算的最大值与历史最大值比较,并返回其中最大的
2.根据返回值,更新需迭代元素
a.无后续元素,返回计算出来的最大值与历史最大值中最大的,结束递归
b.当前元素仍未达到最大,更新当前最大值并继续迭代
c.当前元素已最大,更新历史最大值并继续迭代。