递归函数执行顺序解析: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的完整执行流程帮你梳理:
我们一步步拆解调用顺序:
- 调用
DecimalToBinary(6):- 6>1为True,执行
DecimalToBinary(3),暂停当前函数的后续代码(print(6%2))
- 6>1为True,执行
- 调用
DecimalToBinary(3):- 3>1为True,执行
DecimalToBinary(1),暂停当前函数的后续代码(print(3%2))
- 3>1为True,执行
- 调用
DecimalToBinary(1):- 1>1为False,跳过递归,直接执行
print(1%2)→ 输出1 - 该函数执行完毕,返回上一层
DecimalToBinary(3)
- 1>1为False,跳过递归,直接执行
- 回到
DecimalToBinary(3),继续执行暂停的代码:print(3%2)→ 输出1- 该函数执行完毕,返回上一层
DecimalToBinary(6)
- 该函数执行完毕,返回上一层
- 回到
DecimalToBinary(6),继续执行暂停的代码:print(6%2)→ 输出0- 整个递归流程结束
最终输出就是1 1 0,刚好是6的二进制表示。
内容的提问来源于stack exchange,提问作者user13215502
相关产品推荐
相关产品推荐

