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

递归实现数字拆分为数字列表:当前写法是否正确?有无更优方案?

代码正确性分析

先看正确性:这个代码对正整数输入是有效的,比如slice_num(564)确实能返回[5,6,4]。但它存在几个边界场景的问题:

  • 输入0时,函数返回空列表[],但正常应该返回[0]
  • 输入负数(比如-123)时,同样返回空列表,没法正确处理负号和数字拆分

另外,虽然代码里用if lst is None: lst = []绕开了Python可变默认参数的坑,但这种写法还是有点啰嗦,不是最简洁的递归实现方式。

更优实现方案

1. 修复边界问题的简洁递归版

不用维护外部列表,完全靠递归返回值拼接,同时处理0和负数:

def slice_num(num):
    if num < 0:
        return [-1] + slice_num(-num)
    if num < 10:
        return [num]
    return slice_num(num // 10) + [num % 10]

print(slice_num(564))   # 输出 [5,6,4]
print(slice_num(0))     # 输出 [0]
print(slice_num(-123))  # 输出 [-1,1,2,3]

这个版本逻辑更清晰,也覆盖了所有边界情况。

2. 非递归的迭代实现

如果不需要强制用递归,迭代写法效率更高(避免递归栈的开销),逻辑也很直观:

def slice_num(num):
    if num == 0:
        return [0]
    sign = []
    if num < 0:
        sign = [-1]
        num = -num
    res = []
    while num > 0:
        res.append(num % 10)
        num = num // 10
    return sign + res[::-1]

print(slice_num(564))   # 输出 [5,6,4]
print(slice_num(0))     # 输出 [0]
print(slice_num(-123))  # 输出 [-1,1,2,3]

3. 字符串转换的极简写法

如果追求代码简洁,用字符串转换是最直观的方式,还能处理所有边界:

def slice_num(num):
    if num == 0:
        return [0]
    s = str(num)
    res = []
    if s[0] == '-':
        res.append(-1)
        s = s[1:]
    return res + [int(c) for c in s]

print(slice_num(564))   # 输出 [5,6,4]
print(slice_num(0))     # 输出 [0]
print(slice_num(-123))  # 输出 [-1,1,2,3]

这种写法代码量最少,可读性强,适合大多数日常场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:10:36