gpt4 book ai didi

recursion - 在 Erlang 中返回相邻的重复项

转载 作者:行者123 更新时间:2023-12-03 06:54:57 26 4
gpt4 key购买 nike

我正在尝试学习 Erlang 中的递归,并且正在阅读一本书。但当我面临获取列表并仅返回重复元素的问题时,我遇到了困难。我尝试编写一个仅返回唯一元素的函数,然后将它们从原始列表中删除。

adjacent_dups(L) -> L -- uniques(L).

uniques([]) -> [];
uniques([H|T]) -> [H | [X || X <- uniques(T), X /= H]].

但是,当列表结构不佳时,这不会给出正确的结果。

L = [7,3,4,3]

我的代码将返回

adjacent_dups([7,3,4,3]) -> 3 

我怎样才能得到

adjacent_dups([7,3,4,3]) -> [] 

最佳答案

在函数头中使用模式匹配来查找相邻的相同值:

adjacent_dups(L) ->
adjacent_dups(L, #{}).
adjacent_dups([], Acc) ->
maps:keys(Acc);
adjacent_dups([H,H|T], Acc) ->
adjacent_dups(T,maps:put(H,H,Acc));
adjacent_dups([_|T], Acc) ->
adjacent_dups(T, Acc).

第一个函数 adjacent_dups/1 旨在导出。其余的 adjacent_dups/2 是辅助函数。

adjacent_dups/1 函数创建一个空映射以传递给 adjacent_dups/2 作为累加器的初始值。递归函数经常使用累加器。

adjacent_dups/2 的第一个子句处理传入列表已用完或一开始为空的情况。在这种情况下,我们检索累加器映射的键;这些是我们的相邻值。

adjacent_dups/2 的第二个子句使用模式匹配处理相邻值的情况。在这种情况下,我们将值作为键和值添加到累加器映射中,并使用列表的尾部递归地调用自己。使用 map 可以消除最终结果中的重复项。

adjacent_dups/2 的最后一个子句处理一个值没有相邻值的情况;它只是对列表尾部和未修改的累加器进行递归调用。

关于recursion - 在 Erlang 中返回相邻的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32655717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com