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)
人们不能期望[list, elem]像在 中那样进行隐式扁平化[reverse(tail), head]。
前者是一个列表,这就是您收到返回的嵌套列表的原因。
\n解决该问题的一种方法是使用 .确实将列表添加到另一个列表reverse(tail) ++ [head]。它\xe2\x80\x99s 效率不高,因为它会在每个步骤上生成新列表并且不是尾递归。
正确的解决方案是引入一个累加器来收集已处理的物品
\ndef 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]\nRun Code Online (Sandbox Code Playgroud)\n