我正在使用Elixir学习函数式编程,并且遇到了以下练习:
"您将获得一个两位数的整数n。返回其数字的总和。"
我上来的解决方案看起来有点像毛茸茸的"。
我想知道是否有人可以给Elixir std lib函数/模块提供一些建议并提供更好的解决方案。
我知道我可以和z <- rbind( mtcars , mtcars[ 1:10, ] )
nrow( mtcars)
nrow( z )
(js)一起去,但我和想知道使用Elixir函数的解决方案是否与我想出的更多或更少:
n%10 + Math.floor(n/10)
答案 0 :(得分:1)
你应该避免不必要的操作(转换为字符串,转换为列表等)。
def addTwoDigits(n) do
if n > 0, do: rem(n, 10) + addTwoDigits(div(n, 10)), else: n
end
我使用this来比较我们的功能:
通过使用整数,您可以避免无用的转换/迭代&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