我想找到我的list[1,2,3]
的第n个元素。我想使用递归来选择元素2。
我已经使用以下方法找到了长度:
def module T do
def main do
len([1,2,3])
end
def len([]), do: 0
def len([h|t]), do: 1+len(t)
end
答案 0 :(得分:4)
有一个用于(Enum.at/2
)的库函数,但是如果您想要自己的实现,则:
# Little extra to handle negative positions (from the end of the list)
# element_at([1,2,3], -1) == 3
def element_at(list, n) when n < 0 do
element_at(Enum.reverse(list), -n - 1)
end
def element_at([], _), do: nil
def element_at([h | _t], 0), do: h
def element_at([_h | t], n), do: element_at(t, n - 1)
答案 1 :(得分:3)
我想您想自己实现它。否则,您会在Enum和List模块中使用很多功能。
defmodule Test do
def nth_element(list, n) when is_list(list) and is_integer(n) do
case {list, n} do
{[], _} -> nil
{[element | _], 0} -> element
{[_ | rest], _} -> nth_element(rest, n - 1)
end
end
def nth_element(_, _), do: nil
end
nth_element函数的参数n
是您要查找的元素的索引(从0开始)。如果列表为空或在给定索引处没有元素,则返回nil。否则,该函数将使用模式匹配来获取元素和列表的其余部分。如果要查找第一个元素(索引= n = 0),则它将返回该元素。如果您正在寻找索引较高的元素,则将以列表的其余部分和给定索引减去一个元素的方式递归调用该函数。这样,如果n == 0,则可以在递归中找到所需的元素。在列表为空但n> = 0的情况下,由于第一个函数定义,递归结束并且返回nil。
我将模块保存在test.ex中。执行:
$ iex
iex(1)> c "test.ex"
iex(2)> Test.nth_element([1,2,5], 0)
# => 1
iex(3)> Test.nth_element([1,2,5], 1)
# => 2
iex(4)> Test.nth_element([1,2,5], 2)
# => 5
iex(5)> Test.nth_element([1,2,5], 3)
# => nil