Elixir 中的递归反转列表

Sig*_*ion 3 recursion list elixir

我的任务是获取一个列表,然后使用一个参数递归地反转它。我得到的是这个解决方案:

def reverse(l) do
      [head | tail] = l
      cond do

          tail == [] ->
             head

          true ->
             [reverse(tail) , head]

      end 
end
Run Code Online (Sandbox Code Playgroud)

我尝试过 | 而不是 true 语句中的逗号,但无济于事。该解决方案的问题在于,当输入 [1,2,3,4,5] 时,它会打印出以下内容:

[[[[5, 4], 3], 2], 1]
Run Code Online (Sandbox Code Playgroud)

除了返回列表的最终值之外,它实际上并不将头部添加到列表中。(在本例中为 5)

Ale*_*kin 7

人们不能期望[list, elem]像在 中那样进行隐式扁平化[reverse(tail), head]

\n

前者是一个列表,这就是您收到返回的嵌套列表的原因。

\n

解决该问题的一种方法是使用 .确实将列表添加到另一个列表reverse(tail) ++ [head]。它\xe2\x80\x99s 效率不高,因为它会在每个步骤上生成新列表并且不是尾递归。

\n

正确的解决方案是引入一个累加器来收集已处理的物品

\n
def reverse(input, acc \\\\ [])\ndef reverse([], acc), do: acc\ndef reverse([head | tail], acc) do\n  reverse(tail, [head | acc])\nend \n\nreverse([1, 2, 3])\n#\xe2\x87\x92\xc2\xa0[3, 2, 1]\n
Run Code Online (Sandbox Code Playgroud)\n