Erlang,深_反转(Lst)函数

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功能的情况下会是什么样子 只有一个参数的函数是不够的,我

我正在做一个关于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功能的情况下会是什么样子

只有一个参数的函数是不够的,我们需要一个累加器,一个被带入下一个递归步骤的值。累加器首先是一个空列表,在递归的每一步中,它都将被依次填充

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.