List 获取上一个“;标题「;Erlang中的后列表遍历

List 获取上一个“;标题「;Erlang中的后列表遍历,list,erlang,List,Erlang,标题可能是关闭的,但我有一个名为log\u norm/1的函数,它只返回一个日志规范化值列表,使用公式:log(Input/Input-1)(当前输入相对于先前输入的日志)应用于列表中的每个元素 log_norm(List) -> log_norm(List,[]). log_norm([], Newlist) -> lists:reverse(Newlist); log_norm([Input|T], Newlist) -> X = math:log(

标题可能是关闭的,但我有一个名为
log\u norm/1
的函数,它只返回一个日志规范化值列表,使用公式:log(Input/Input-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]).
在遍历到列表的新“head”后,如何获取上一个“head”或输入?

使用hd()


我想这会管用的

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]).

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


使用log_norm([Input|prev | Input | T],Newlist)->从列表的头部读取两个值……此外,您还可以使用lists:nth()访问第n个元素。如果列表只有一个元素,则此操作将失败!这永远不会发生!基本情况有两个元素,您不能使用一个元素进行计算,因为您需要i-1。如果您测试它,您将看到:D2>语言:log_norm([1,2])。[0.6931471805599453]3>语言:log_norm([1])。错误的参数4>语言:log_范数([1,2,3])。[0.6931471805599453,0.4054651081081644]我使用您推荐的列表添加了另一个答案:nth(),它也有效。是的,这也有效,我认为您在这个问题上不会有这个问题,但请记住,一般来说,携带列表的副本是没有效率的。再说一遍,我认为这与这个问题无关;)@Khashayar在另一个参数中携带一个额外的“副本”花费很少,因为列表没有被复制,它只是一个被传递的引用。做一个清单:N的花费要多得多。一次匹配两个元素要快得多。@rvirding你完全正确!这也是我在回答中所做的。希望在哥德堡见到你:D
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]).
 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).