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

求助解析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的条件,递归深入停止,开始执行当前层的打印逻辑
  • 回溯输出阶段:从最内层的函数开始,逐层执行完之前暂停的打印语句,执行完就返回上一层

    • 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,当前层结束返回

最终控制台输出的字符串是011000。

细节说明:输出开头的0是num=0层打印的前导无效位,去掉之后的11000就是24对应的正确二进制值(16+8=24)。如果需要去掉前导0,可以把打印语句放到if判断内部,只在num>=1时输出余数即可。

内容的提问来源于stack exchange,提问作者Ömer Koşar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:27:17