Erlang,深_反转(Lst)函数
我正在做一个关于Erlang的练习,我无法实现这个函数 深槽反向(Lst) 在所有级别反转L的元素 例如,如果Lst是[a,[b,c,[d]],e],深反转应该返回[e,[[d],c,b],a] 有人能帮我做这个练习吗Erlang,深_反转(Lst)函数,erlang,Erlang,我正在做一个关于Erlang的练习,我无法实现这个函数 深槽反向(Lst) 在所有级别反转L的元素 例如,如果Lst是[a,[b,c,[d]],e],深反转应该返回[e,[[d],c,b],a] 有人能帮我做这个练习吗 element_reverse(List) -> Flat = lists:flatten(List), lists:reverse(Flat). 首先,让我们看看一个简单的反向函数在没有deep功能的情况下会是什么样子 只有一个参数的函数是不够的,我
element_reverse(List) ->
Flat = lists:flatten(List),
lists:reverse(Flat).
首先,让我们看看一个简单的反向函数在没有deep功能的情况下会是什么样子 只有一个参数的函数是不够的,我们需要一个累加器,一个被带入下一个递归步骤的值。累加器首先是一个空列表,在递归的每一步中,它都将被依次填充
simple_reverse(List) -> simple_reverse(List, []).
因此,现在我们需要定义一个2参数函数,以便调用simple\u reverse(List,[])
simple_reverse([H|T], Accu) ->
simple_reverse(T, [H] ++ Accu);
simple_reverse([], Accu) -> Accu.
函数定义的第一部分处理包含内容的列表[H|T]
意味着我们有一个列表,H
(Head)是它的第一个元素,而T
(Tail)是列表的其余部分。我们再次调用simple\u reverse
,尾部作为第一个参数,并首先使用累加器头部累加头部值
第二部分处理列表为空的情况。当这种情况发生时,我们可以返回累加器(所有先累加的值)
当您了解这里发生的情况时,deep_reverse
的实现相对简单。如果你不明白这里发生了什么,你应该读一些关于和
这里我们来看看H
-值H
可以是一个列表本身([| |
),也可以是其他内容(
)。递归本质上与simple\u reverse
相同,除非H
是一个列表。如果它是一个列表,我们必须在执行递归时再次调用H
上的deep\u reverse
如果您很难理解语法,这里有一些链接:和您需要什么帮助?您到目前为止尝试了什么?我遵循这个想法。首先,我使用展平函数提取列表中的所有元素。然后,我使用函数reverse创建一个反向列表。我目前的困难是无法用输入列表中的元素替换反向列表中的元素。@tuanguyenhoang这可能不是最好的前进方式,通过调用
flatten
,您将破坏列表中的结构信息。更好的方法是使用带有累加器的递归函数自己实现反转,而不是使用lists:reverse
。我很肯定,这次演习的目的正是这样。尽管如此,我还是鼓励你编辑你的问题,并展示你已经完成的代码——这使得回答更简单,而且你不会得到那么多的反对票。谢谢你的详细解释。但是,当我尝试使用List=[1,2,3,4,5,6,7,8,9]运行函数时,结果似乎不正确。它应该返回[9,8,7,6,5,4,3,2,1],而不是[9,8,7,6,5,4,3,2,1],你确定吗?这似乎不对。在您的解决方案中,“2”是第一个内部列表的一部分,它永远不会是这种情况,因为在本例中,它是最外层列表的一部分。“8”也是一样,它是外部列表的一部分,而它应该是第一个内部列表的一部分。哎呀,这是我的错。你是对的。对不起!但是你能告诉我如何修改上面的函数,让它返回[9,8,7,6,5,4,3,2,1]吗。。。不,我真的没有时间。你应该自己弄清楚。
deep_reverse(List) -> deep_reverse(List, []).
deep_reverse([H|T], Accu) ->
case H of
[_|_] -> deep_reverse(T, [deep_reverse(H)] ++ Accu);
_ -> deep_reverse(T, [H] ++ Accu)
end;
deep_reverse([], Accu) -> Accu.