在Erlang中遍历列表后获取前一个“Head”

时间:2013-08-13 11:17:15

标签: list erlang

标题可能已关闭,但我有一个名为log_norm/1的函数,它只是使用以下公式返回日志标准化值列表: log(输入 t / Input < sub> t-1 )(当前输入超过先前输入的日志)应用于列表中的每个元素。

log_norm(List) ->
    log_norm(List,[]).
log_norm([], Newlist) ->
    lists:reverse(Newlist);
log_norm([Input|T], Newlist) ->
    X = math:log(Input/???), % ??? should be the previous head of the list Input-1. 
    log_norm(T, [X|Newlist]).

如何在遍历列表的新“头部”后获取之前的“头部”或输入?

3 个答案:

答案 0 :(得分:0)

我认为这将有效。

log_norm(List = [_H1,_H2|_T]) ->
    log_norm(List,[]);
log_norm(_) ->
    bad_argument.

log_norm([Input_prev,Input], Newlist) ->
    X = math:log(Input/Input_prev), 
    lists:reverse([X|Newlist]);
log_norm([Input_prev,Input|T], Newlist) ->
    X = math:log(Input/Input_prev), 
    log_norm([Input|T], [X|Newlist]).

答案 1 :(得分:0)

我还通过添加2个参数创建了一个解决方案,原始列表和用于获取先前使用列表的计数器N:nth():D

 log_norm(List) ->
        log_norm(List,[], List, 0).
    log_norm([], Newlist, _,_) ->
        lists:reverse(Newlist);
    log_norm([Input|T], Newlist, OrigList, N) ->
        if
            N == 0 -> X = math:log(Input/Input);
            true -> X = math:log(Input/lists:nth(N, OrigList))
        end,
        log_norm(T, [X|Newlist], OrigList, N+1).

答案 2 :(得分:-1)

使用hd()。

log_norm(List) ->
    log_norm(List,[]).
log_norm([Input,Last], Newlist) ->
    X =math:log(Input/Last),
    lists:reverse([X|Newlist]);
log_norm([Input|T], Newlist) ->
    X = math:log(Input/hd(T)), 
    log_norm(T, [X|Newlist]).