Вернуть n-й элемент списка - PullRequest
0 голосов
/ 22 января 2019

Я хочу найти n-й элемент моего list[1,2,3]. Я хочу выбрать элемент 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

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Полагаю, вы хотите реализовать это самостоятельно.В противном случае вы можете использовать множество функций в модулях 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

Аргумент n функции nth_element - это индекс (начинается с 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
0 голосов
/ 22 января 2019

Для этого есть определенная библиотечная функция (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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...