Elixir如何实现递归累加数位直到结果为单个数(数字根)
Elixir 实现数字根计算
问题
需要实现逻辑:递归计算整数所有数位的和,直到最终结果为单个数字(即数字根)。
示例:对数字1253计算数位和,1+2+5+3得到11,结果为两位数,再次对11数位求和得到2,最终返回单个数字2。
当前已实现的代码仅完成单次数位求和,未实现递归直到得到个位数的逻辑,现有代码:
defmodule Kata do def digital_root(n) do n |> Integer.digits() |> Enum.reduce(0, &Kernel.+/2) end end n = 1253
解决方法
方法1:基于现有代码加递归逻辑
用Elixir的守卫从句设置递归终止条件:当传入值小于10时,说明已经是个位数,直接返回值终止递归;否则执行现有数位求和逻辑,把求和结果再次传入digital_root函数处理即可。
修改后代码:
defmodule Kata do # 终止条件:个位数直接返回 def digital_root(n) when n < 10, do: n def digital_root(n) do n |> Integer.digits() |> Enum.reduce(0, &Kernel.+/2) |> digital_root() end end
验证:调用Kata.digital_root(1253)时,第一次求和得到11,11大于等于10触发递归,再次求和得到2,2是个位数直接返回,结果正确。
方法2:数学公式法(时间复杂度O(1))
数字根存在固定数学规律,不需要拆分数位、不需要递归,直接通过取模运算即可得到结果:
- 输入为0时返回0
- 非0输入的数字根等于
1 + (n - 1) 对9取余
对应实现代码:
defmodule Kata do def digital_root(0), do: 0 def digital_root(n), do: 1 + rem(n - 1, 9) end
内容的提问来源于stack exchange,提问作者Omowumi Tobiloba
相关产品推荐
相关产品推荐

