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

递归函数执行顺序解析:Python十进制转二进制递归代码疑问

关于Python递归实现十进制转二进制的疑问解答

首先先把你贴的代码放出来,方便对照:

def DecimalToBinary(num):
    if num > 1:
        DecimalToBinary(num//2)
    print(num%2)

你的疑问逐一解答:

1. 为什么print语句在if外却每次都会执行?

递归的核心是每一次函数调用都会完整执行函数内的所有代码,除非遇到return提前退出。当你调用这个函数时,不管num是否大于1,只要函数没有被提前终止,都会走到if块之后的print语句。

举个例子,当num=3时,先执行if里的递归调用DecimalToBinary(1),但这个递归调用执行完之后,程序会回到DecimalToBinary(3)的上下文,继续执行剩下的print语句——并不会因为执行了递归就跳过当前函数的后续代码。

2. 为什么它能反向输出余数?

这是因为print语句是在递归调用之后执行的,递归的执行顺序是“先深入,再回溯”:

  • 我们计算二进制时,num%2得到的是当前数的最低位,但递归会先处理更高位的计算(比如处理6时先去算3的二进制,处理3时先去算1的二进制)
  • 只有当最内层的递归执行完(比如DecimalToBinary(1)),才会开始从内到外执行每一层的print语句,这时候打印的顺序刚好是从最高位到最低位,也就是正确的二进制顺序。

3. 按递归逻辑,print难道不应仅在num<=1时执行?

这是对递归的误解~num<=1时只是不会触发新的递归调用,但当前函数的print语句依然会执行;而num>1时,会先触发递归,等递归的整个链条执行完后,再回到当前函数执行print。换句话说,每一层递归调用都会执行自己的print语句,不是只有num<=1的那一层。

用num=6的完整执行流程帮你梳理:

我们一步步拆解调用顺序:

  1. 调用DecimalToBinary(6):
    • 6>1为True,执行DecimalToBinary(3),暂停当前函数的后续代码(print(6%2))
  2. 调用DecimalToBinary(3):
    • 3>1为True,执行DecimalToBinary(1),暂停当前函数的后续代码(print(3%2))
  3. 调用DecimalToBinary(1):
    • 1>1为False,跳过递归,直接执行print(1%2) → 输出1
    • 该函数执行完毕,返回上一层DecimalToBinary(3)
  4. 回到DecimalToBinary(3),继续执行暂停的代码:print(3%2) → 输出1
    • 该函数执行完毕,返回上一层DecimalToBinary(6)
  5. 回到DecimalToBinary(6),继续执行暂停的代码:print(6%2) → 输出0
    • 整个递归流程结束

最终输出就是1 1 0,刚好是6的二进制表示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:27:45