如何在 Elixir 中展平嵌套列表?
How do I flatten a nested list in Elixir?
我有一个嵌套列表 [1, [2, [3, 4], 5], 6]
。我怎样才能把它弄平,让它变成 [1, 2, 3, 4, 5, 6]
?
defmodule Util do
@doc """
Flattens nested lists
## Examples
iex> Util.flatten_nested([1, [2, [3, 4], 5], 6])
[1, 2, 3, 4, 5, 6]
"""
def flatten_nested(list, acc \ []),
do: flatten_nested_rev(list, acc) |> Enum.reverse()
@doc """
Flattens nested lists, and returns a reversed list
## Examples
iex> Util.flatten_nested_rev([1, [2, [3, 4], 5], 6])
[6, 5, 4, 3, 2, 1]
"""
def flatten_nested_rev(list, acc \ [])
def flatten_nested_rev([], acc) do
acc
end
def flatten_nested_rev([list | rest], acc) when is_list(list) do
flatten_nested_rev(rest, flatten_nested_rev(list, acc))
end
def flatten_nested_rev([element | rest], acc) do
flatten_nested_rev(rest, [element | acc])
end
end
不用重新发明轮子,直接用List.flatten/1
iex(1)> List.flatten([1, [2, [3, 4], 5], 6])
[1, 2, 3, 4, 5, 6]
这是一个很好的旧递归方法(未优化尾调用)
defmodule Test do
# degenerate case
def flatten([]), do: []
# list with more than 1 elt
def flatten([ head | tail ]) do
flatten(head) ++ flatten(tail)
end
# list with only one elt
def flatten(head), do: [ head ]
done
我有一个嵌套列表 [1, [2, [3, 4], 5], 6]
。我怎样才能把它弄平,让它变成 [1, 2, 3, 4, 5, 6]
?
defmodule Util do
@doc """
Flattens nested lists
## Examples
iex> Util.flatten_nested([1, [2, [3, 4], 5], 6])
[1, 2, 3, 4, 5, 6]
"""
def flatten_nested(list, acc \ []),
do: flatten_nested_rev(list, acc) |> Enum.reverse()
@doc """
Flattens nested lists, and returns a reversed list
## Examples
iex> Util.flatten_nested_rev([1, [2, [3, 4], 5], 6])
[6, 5, 4, 3, 2, 1]
"""
def flatten_nested_rev(list, acc \ [])
def flatten_nested_rev([], acc) do
acc
end
def flatten_nested_rev([list | rest], acc) when is_list(list) do
flatten_nested_rev(rest, flatten_nested_rev(list, acc))
end
def flatten_nested_rev([element | rest], acc) do
flatten_nested_rev(rest, [element | acc])
end
end
不用重新发明轮子,直接用List.flatten/1
iex(1)> List.flatten([1, [2, [3, 4], 5], 6])
[1, 2, 3, 4, 5, 6]
这是一个很好的旧递归方法(未优化尾调用)
defmodule Test do
# degenerate case
def flatten([]), do: []
# list with more than 1 elt
def flatten([ head | tail ]) do
flatten(head) ++ flatten(tail)
end
# list with only one elt
def flatten(head), do: [ head ]
done