标题可能已关闭,但我有一个名为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]).
如何在遍历列表的新“头部”后获取之前的“头部”或输入?
答案 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]).