Nano Hash - криптовалюты, майнинг, программирование

Как я могу вернуть список в Эликсире?

Я работаю над книгой Programming Elixir и играю с упражнениями. У меня есть функция суммы, в которой я хотел бы вернуть значение суммы в списке [], а не просто число, но я получаю bad argument in arithmetic expression. Не могли бы сделать с некоторыми направлениями?

defmodule Mymod do
  def sum([]), do: []
  def sum([head | tail]) do
    [head  + sum(tail)]
  end
end
19.09.2016

Ответы:


1

Проблема в том, что Mymod.sum/1 возвращает список, а вы пытаетесь добавить его к номеру.

Чтобы это работало, вы должны «раскрыть» список, возвращаемый sum, в число, а затем добавить его:

defmodule Mymod do
  def sum([]), do: []
  def sum([head | tail]) do
    case sum(tail) do
      []  -> [head]
      [s] -> [head + s]
    end
  end
end

IO.inspect Mymod.sum([5, 6, 7])
#⇒ [18]

Вариант хвостовой рекурсии будет выглядеть так (вдохновленный ответом @theanh-le):

defmodule Mymod do
  def sum(list, acc \\ 0)

  def sum([], 0), do: []
  def sum([], acc), do: [acc]
  def sum([head | tail], acc) do
    sum(tail, head + acc)
  end
end

IO.inspect Mymod.sum([5, 6, 7])
#⇒ [18]
19.09.2016
  • Проголосовал за первую строку ответа, которая подчеркивает точную проблему. 19.09.2016
  • Вы должны выбрать правильный ответ (если есть) и пометить его зеленым, кстати. 19.09.2016
  • Сойдет, но все еще пытаюсь найти способ без использования аккумулятора. 20.09.2016
  • 1. Почему вы пытаетесь не использовать аккумулятор? Это очень (я бы сказал, самая) распространенная практика в FP. 2. Нет возможности использовать хвостовую рекурсию без аккумулятора; хотите ли вы использовать TR (списки детерминированно относительно малы), просто возьмите прежний фрагмент из моего ответа. 20.09.2016

  • 2

    Есть способ, которым вы можете использовать tail recursive, чтобы сделать ваш код намного красивее:

    defmodule MyMod do
      def sum([]), do: []
      def sum(list) do
        do_sum(0, list)
      end
    
      defp do_sum(current_sum, []), do:[current_sum] 
      defp do_sum(current_sum, [head | tail]) do
        new_sum = current_sum + head
        do_sum(new_sum, tail)
      end
    end
    

    икс:

    iex()> MyMod.sum([5,6,7])
    [18]
    
    19.09.2016
  • Проголосовал за хвостовую рекурсию; у этого ответа есть один сбой: он возвращает неожиданный [0] для пустого списка, в то время как OP вернул пустой список. Скорее всего, потребуется дополнительный defp do_sum(0, []), do:[]. 19.09.2016
  • Верно. Я забыл. Большое спасибо. 19.09.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..