递归实现数字拆分为数字列表:当前写法是否正确?有无更优方案?
代码正确性分析
先看正确性:这个代码对正整数输入是有效的,比如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
相关产品推荐
相关产品推荐

