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