您的位置:首页 > 其它

erlang杂记六 --- 写了个小函数(2):最长子序列

2013-05-23 22:36 295 查看
代码:

-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.当前元素已最大,更新历史最大值并继续迭代。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: