List 返回列表的第n个元素

List 返回列表的第n个元素,list,recursion,elixir,List,Recursion,Elixir,我想找到列表[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 该Enum.at/2有一个库函数,但如果您想要自己的实现: # Little extra to handle negative positions (from the end of

我想找到列表[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

该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)

该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)

我想你是想自己去实现它。除此之外,在和模块中还有许多函数供您使用

n_元素函数的参数n是以所查找元素的0开头的索引。如果列表为空或给定索引中没有元素,则返回nil。否则,函数将使用模式匹配来获取元素和列表的其余部分。如果您正在查找第一个元素index=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

我想你是想自己去实现它。除此之外,在和模块中还有许多函数供您使用

n_元素函数的参数n是以所查找元素的0开头的索引。如果列表为空或给定索引中没有元素,则返回nil。否则,函数将使用模式匹配来获取元素和列表的其余部分。如果您正在查找第一个元素index=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

有几种不同的方法可以做到这一点,包括Enum.at/2或Enum.reduce_while/3,但我想你是在问如何用递归解决这个问题?有几种不同的方法可以做到这一点,包括Enum.at/2或Enum.reduce_while/3,但我想你是在问如何用递归解决这个问题?太棒了!如果适合这个问题,请随意接受答案:我会在n<0时添加def element_atlist,n,do:h |>:lists.reverse |>element_at-n以优雅地处理element_atlist,-1。我添加了两个下划线以避免编译提示,因为没有使用变量。太棒了!如果适合这个问题,请随意接受答案:我会在n<0时添加def element_atlist,n,do:h |>:lists.reverse |>element_at-n以优雅地处理element_atlist,-1。我添加了两个下划线以避免由于未使用的变量而产生编译提示。混合子句和大小写以实现相同的目标是一种反模式。@IvanYurov的回答更直截了当。你的回答是对的,但对我来说,为了清楚代码的意图,它似乎安排得更周密一些。只有个人感觉。然后使用案例{list,n}do⏎ {[], _} -> ... ⏎ {_, 0} -> ... ⏎ {,n}->。。。⏎ 结束:好的,我同意。那么guard子句和由此产生的catch all定义呢?现在在我看来是一致的;我想知道这在性能方面与几个函数子句相比有什么不同,我猜它没有太大区别。混合子句和case以实现相同的目标是一种反模式。@IvanYurov的回答更直截了当。你的回答是对的,但对我来说,为了清楚代码的意图,它似乎安排得更周密一些。只有个人感觉。然后使用案例{list,n}do⏎ {[], _} -> ... ⏎ {_, 0} -> ... ⏎ {,n}->。。。⏎ 结束:好的,我同意。那么guard子句和由此产生的catch all定义呢?现在在我看来是一致的;我想知道在性能方面这与几个函数子句相比有什么不同,我猜想它没有太大区别。