F#如何将整数拆分为各数位元素组成的新列表
F# 整数转按高位到低位排列的数位列表实现
核心逻辑是利用整数取模% 10取当前个位、整数除以10/ 10移除个位的特性递归拆分,注意直接递归拼接容易出现数位顺序颠倒、列表拼接效率低的问题,下面给两种可运行的实现:
基础直观版本
逻辑最简单好理解,每次递归拆分出高位部分的列表,再把当前个位拼到列表末尾:
let rec convertInt x = if x < 10 then [x] else convertInt (x / 10) @ [x % 10]
这个版本的缺点是列表末尾追加操作@每次都要遍历已有列表,数字很大的时候性能一般。
高性能尾递归版本
用内部尾递归函数+累积参数收集数位,最后一次性反转列表,时间复杂度更优,还补了0值的边界处理:
let convertInt x = let rec loop remaining acc = if remaining = 0 then acc else loop (remaining / 10) (remaining % 10 :: acc) if x = 0 then [0] else loop x [] |> List.rev
- 内部
loop函数的remaining参数是还没拆分的剩余数字,acc是已经拆分出的、个位在前的数位集合 - 递归到剩余数字为0时,累积的列表是倒序的(比如输入561时累积结果是[1;6;5]),调用
List.rev反转后就得到高位在前的正确结果 - 如果需要支持负数输入,只要在进入递归前先对输入取绝对值
abs x即可
测试用例执行效果:
convertInt 561 → 输出
[5; 6; 1]
convertInt 0 → 输出[0]
convertInt 987654 → 输出[9; 8; 7; 6; 5; 4]
内容的提问来源于stack exchange,提问作者kelperg1
相关产品推荐
相关产品推荐

