求助解析Python的DecimalToBinary递归转二进制函数逻辑
递归版十进制转二进制函数逻辑详解
你提到的代码如下:
def DecimalToBinary(num): if num >= 1: DecimalToBinary(num // 2) print(num % 2, end = '') if __name__ == '__main__': dec_val = 24 DecimalToBinary(dec_val)
核心实现原理
正整数十进制转二进制的标准数学方法是除2取余法:
- 反复用当前数除以2,记录每次得到的余数
- 用除法得到的商作为下一次计算的数,直到商为0停止计算
- 把所有记录的余数从最后一个到第一个倒序排列,就是对应的二进制结果
这段递归代码没有用额外列表存储余数再反转,而是直接利用了函数调用的栈特性:递归调用会先逐层深入到终止条件,再从最内层往最外层依次执行后续代码,天然实现了余数的逆序输出。
传入参数24时的完整执行流程
整个执行过程分「递归深入」和「回溯输出」两个阶段:
递归深入阶段:每层函数只要满足
num >=1就优先调用传入num//2的自身函数,暂时不执行后面的打印语句- 初始调用传入24,满足条件,调用
DecimalToBinary(12),暂停当前层后续逻辑 - 传入12,满足条件,调用
DecimalToBinary(6),暂停当前层后续逻辑 - 传入6,满足条件,调用
DecimalToBinary(3),暂停当前层后续逻辑 - 传入3,满足条件,调用
DecimalToBinary(1),暂停当前层后续逻辑 - 传入1,满足条件,调用
DecimalToBinary(0),暂停当前层后续逻辑 - 传入0,不满足
num>=1的条件,递归深入停止,开始执行当前层的打印逻辑
- 初始调用传入24,满足条件,调用
回溯输出阶段:从最内层的函数开始,逐层执行完之前暂停的打印语句,执行完就返回上一层
- num=0层:计算
0%2=0,打印0,当前层结束返回 - num=1层:之前的递归调用已返回,计算
1%2=1,打印1,当前层结束返回 - num=3层:计算
3%2=1,打印1,当前层结束返回 - num=6层:计算
6%2=0,打印0,当前层结束返回 - num=12层:计算
12%2=0,打印0,当前层结束返回 - num=24层:计算
24%2=0,打印0,当前层结束返回
- num=0层:计算
最终控制台输出的字符串是011000。
细节说明:输出开头的0是num=0层打印的前导无效位,去掉之后的
11000就是24对应的正确二进制值(16+8=24)。如果需要去掉前导0,可以把打印语句放到if判断内部,只在num>=1时输出余数即可。
内容的提问来源于stack exchange,提问作者Ömer Koşar
相关产品推荐
相关产品推荐

