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

如何使用SML实现数字根(Digital Root)计算功能

SML数字根函数修改方案

问题根因

你当前的digitalRoot函数仅执行了单次数位拆分求和逻辑,没有对求和结果做是否为个位数的判断,也没有触发重复求和的递归流程,所以只能得到首次求和的中间结果。

基于现有代码的修改方案

你已经实现的digits数位拆分函数、sum求和函数不需要调整,仅需要在digitalRoot中增加终止判断和递归调用即可:

fun digits(m:int) =
  if m < 10 then
    [m]
  else 
    let
      val smallestDigit = m mod 10
      val remainingDigits = m div 10
    in
      digits remainingDigits @ [smallestDigit]
    end
   

fun sum(ints) =
    if null ints then 0
    else
    (hd ints) + sum(tl ints)                              
                              
fun digitalRoot(i:int) =
    let
       val results = sum(digits i)
    in
       if results < 10 then results else digitalRoot results
    end      

运行验证

调用digitalRoot 6381的执行流程如下:

  1. 首次计算sum(digits 6381)得到结果18
  2. 18≥10,触发递归调用digitalRoot 18
  3. 计算sum(digits 18)得到结果9
  4. 9<10满足终止条件,返回最终结果9,符合预期。

可选优化方案(数学公式实现)

数字根有成熟的数学推导公式,可以省去递归拆分数位的开销,运行效率更高:

fun digitalRoot(i:int) =
    if i = 0 then 0
    else 
        let val mod9 = i mod 9
        in if mod9 = 0 then 9 else mod9
        end

该版本和递归版本输出完全一致。

内容的提问来源于stack exchange,提问作者Lasting

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:42:02