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

代码:

-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.当前元素已最大,更新历史最大值并继续迭代。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值