Elixir:总和2+位数

时间:2018-05-15 01:06:22

标签: elixir

我正在使用Elixir学习函数式编程,并且遇到了以下练习:

  

"您将获得一个两位数的整数n。返回其数字的总和。"

我上来的解决方案看起来有点像毛茸茸的&#34;。 我想知道是否有人可以给Elixir std lib函数/模块提供一些建议并提供更好的解决方案。 我知道我可以和z <- rbind( mtcars , mtcars[ 1:10, ] ) nrow( mtcars) nrow( z ) (js)一起去,但我和想知道使用Elixir函数的解决方案是否与我想出的更多或更少:

n%10 + Math.floor(n/10)

3 个答案:

答案 0 :(得分:1)

你应该避免不必要的操作(转换为字符串,转换为列表等)。

我会使用div/2&amp; rem/2在递归函数中:

def addTwoDigits(n) do
  if n > 0, do: rem(n, 10) + addTwoDigits(div(n, 10)), else: n
end

我使用this来比较我们的功能:

  • 您的功能运行在~16μs
  • 上述功能在~4μs
  • 内运行

通过使用整数,您可以避免无用的转换/迭代&amp;得到一个计算结果的函数〜快4倍!

答案 1 :(得分:1)

由于这是一个练习/学习的例子,我认为预期的答案将是一个包含许多条款的函数:

defmodule M do
  def add(num, acc \\ 0)
  def add(num, _acc) when num > 99, do: raise("Invalid #{num}")
  def add(num, acc) when num < 10, do: acc + num
  def add(num, acc), do: add(rem(num, 10), acc + div(num, 10))
end

IO.puts M.add(35)
#⇒ 8
IO.puts M.add(5)
#⇒ 5
IO.puts M.add(88)
#⇒ 16
IO.puts M.add(101)
#⇒ ** (RuntimeError) Invalid 101

对于这个特定的任务来说,这绝对是一个巨大的矫枉过正,但想想使这个代码对有3个数字的整数求和是多么容易(与其他任何非功能性方法不同。)

答案 2 :(得分:1)

最简单且最接近您最初的想法,将通过利用以下功能:

Integer.digits(123)
[1, 2, 3]

获取记录的here

中的每个数字

然后你可以简单地做:

def sum_digits_in_number(n) do
   n
   |> Integer.digits
   |> Enum.sum
end