如何在SML中编写更模块化的整数转数字列表代码?
SML 整数按位拆分函数优化实现
原代码存在的问题
- 硬编码按位数做分支判断,仅支持最多7位整数,超出位数的输入会返回错误的拆分结果
- 边界校验存在漏洞:等于100、1000等整十/整百/整千值时,会落入错误分支返回不符合预期的结果
- 大量重复逻辑,无复用性,后续调整成本极高
优化方案
我们可以通过递归结构实现任意长度整数的按位拆分,无需硬编码位数判断:
(* 支持正负整数的通用版本 *) fun digits(m: int) = let (* 先取绝对值适配负数输入,不需要支持负数可去掉该层处理 *) val num = Int.abs m in if num < 10 then [num] else (* 递归拆分除最后一位外的高位,再拼接当前最后一位 *) digits(num div 10) @ [num mod 10] end
如果只需要处理正整数,可使用更简洁的版本:
(* 仅支持正整数的简化版本 *) fun digits(m: int) = if m < 10 then [m] else digits(m div 10) @ [m mod 10]
测试用例
- 调用
digits 12345返回[1,2,3,4,5],符合需求 - 调用
digits 9876543210返回[9,8,7,6,5,4,3,2,1,0],支持任意长度合法整数 - 调用
digits (-456)返回[4,5,6](通用版本) - 调用
digits 0返回[0]
内容的提问来源于stack exchange,提问作者Jrandl
相关产品推荐
相关产品推荐

