如何使用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的执行流程如下:
- 首次计算
sum(digits 6381)得到结果18 - 18≥10,触发递归调用
digitalRoot 18 - 计算
sum(digits 18)得到结果9 - 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
相关产品推荐
相关产品推荐

