Erlang 二郎;cons运算符不平坦

Erlang 二郎;cons运算符不平坦,erlang,Erlang,我编写了函数: rotate_bin_list_right([H|T]) -> erlang:display(H), erlang:display(T), erlang:display([T|H]), [T|H]. 使用[,,,,]调用时,它会打印: <<"2">> [<<"3">>,<<"4">>,<<"2">>,<<"3">>,<<"4

我编写了函数:

rotate_bin_list_right([H|T]) ->
  erlang:display(H),
  erlang:display(T),
  erlang:display([T|H]),
  [T|H].
使用
[,,,,]
调用时,它会打印:

 <<"2">>
[<<"3">>,<<"4">>,<<"2">>,<<"3">>,<<"4">>]
[[<<"3">>,<<"4">>,<<"2">>,<<"3">>,<<"4">>]|<<"2">>]

[,,,,]
[[,,,,]|]
我期待着一个“扁平化列表”:

[,,,,]

发生了什么事?

T
是一个列表,而
H
不是列表,因此构造
[T|H]
创建了一个,其中尾部不是列表。

T
是一个列表,而
H
不是列表,因此构造
[T|H]
创建了一个列表,其中尾部不是列表。

<,这是正确的实现:

rotate_bin_list_right([H|T]) -> T ++ [H].

为了完整起见,这是正确的实现:

rotate_bin_list_right([H|T]) -> T ++ [H].

除了Steve在回答中提到的内容之外,要在返回时获得一个扁平化列表,您必须将“H”列为一个列表,并使用扁平化函数,如:
erlang:display(列表:扁平化([T|[H]])。
@liam_g:It的实现速度不必要地慢<代码>列表:展平/1是Erlang实现的
++/2
是Bif。除了Steve在回答中提到的,要在返回时获得展平的列表,您必须将“H”作为列表,并使用展平函数,如:
Erlang:display(列表:展平([T|[H]])。
@liam_g:它的实现速度太慢了<代码>列表:flatten/1是Erlang实现的
++/2
是Bif。我是Erlang的新手,从我所读到的内容来看,
++
与前置和反转相比非常糟糕,因为它会导致二次递归函数。@Tommy:我明白了。你是新来的二郎。所以,从一个不是的人那里听取建议。如果您喜欢此操作,这是正确的
rotate\u list\u right/1
。这不是递归函数,所以它不能导致任何递归函数,包括二次函数。谢谢你的帮助。在O(1)中有这样的方法吗?@汤米:不,在O(1)中没有一种方法可以做,但是当你认为它是不可变的单链表时,O(n)是好的。我对Erlang是新的,并且从我读到的, ++/<代码>是非常坏的,而不是准备和反转,因为它可以导致二次递归函数。你是新来的二郎。所以,从一个不是的人那里听取建议。如果您喜欢此操作,这是正确的
rotate\u list\u right/1
。这不是递归函数,所以它不能导致任何递归函数,包括二次函数。谢谢你的帮助。那么在O(1)中有没有这样的方法?@汤米:不,在O(1)中没有一种方法可以做到这一点,但是当你认为它是不变的单链表时,O(n)是好的。“不,”汤米,<代码> [H[vi] t] < /Cord>给你一个列表,其中包含一个包含“代码>h < /代码>的单元素列表,作为头和<代码> t <代码>作为尾部。”汤米有关正确的解决方案,请参见@Hynek Pichi Vychodil的答案。正如他解释的那样,你对
++
的恐惧是没有根据的。还要注意的是,我的答案没有包括解决方案,因为这不是你所问的;你只是问“发生了什么事”。不,@Tommy,
[[H]|T]
给你一个列表,其中包含一个元素列表,其中
H
作为头,
T
作为尾。@Tommy,请参阅@Hynek Pichi Vychodil的答案以获得正确的解决方案。正如他解释的那样,你对
++
的恐惧是没有根据的。还要注意的是,我的答案没有包括解决方案,因为这不是你所问的;你只是问“发生了什么事”。