You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:12:22