递归实现任意进制转换
在处理进制转换时,递归往往比循环更直观。我们不需要手动维护一个结果字符串的拼接顺序,因为递归栈天然地帮我们完成了后进先出的逆序拼接。
核心逻辑
定义一个字符集用于映射 0-15 的值。当数字小于基数时,直接返回对应字符;否则,先递归处理商,再拼接当前位的余数字符。
def toStr(num, base):
# 字符集覆盖 0-9 和 A-F
convertString = "0123456789ABCDEF"
# 基准情况:剩余数字小于基数,直接查表
if num < base:
return convertString[num]
else:
# 递归调用处理高位,当前位余数拼在后面
return toStr(num // base, base) + convertString[num % base]
执行流程示例
以 toStr(15, 16) 为例:
- 15 小于 16,直接返回 F。
- 如果是 toStr(17, 16),17 >= 16,进入 else。
- 递归 toStr(1, 16) 返回 1。
- 拼接 1 + convertString[1] -> 11。
测试验证
print(toStr(15, 16)) # 输出 F
print(toStr(99, 2)) # 输出 1100011
print(toStr(32, 8)) # 输出 40
print(toStr(4739874, 11)) # 输出具体结果
这段代码虽然短,但清晰地展示了递归如何将大问题拆解为小问题。实际工程中要注意递归深度限制,对于超大整数可能需要迭代方案,但在教学和理解算法结构上,递归是最优雅的解法之一。


