发现我很难全神贯注于递归,非常感谢一些见解。 我试图通过连续将数字除以 2 来理解递归流。
def divide_by_2(num):
if num > 1:
divide_by_2(num // 2)
print(num)
print(num % 2,num)
divide_by_2(39)
输出:
1 1
2
0 2
4
0 4
9
1 9
19
1 19
39
1 39
我的问题是
1) 1 39 不应该先打印吗,为什么在最后才打印?为什么顺序颠倒了?
2)两个打印语句中哪个应该先执行,为什么?
请您参考如下方法:
用手指跟随代码行(从底线开始,因为它是一切的开始),每次遇到 divide_by_2 时,跳回顶部
您会注意到,您从 39 开始进入函数,并在打印任何内容之前再次调用 divide_by_2。
你会一直这样下去,直到你下降到 1,此时你将跳过对 divide_by_2 的调用,然后你开始打印东西,随着调用堆栈的展开以相反的顺序
事情平息了,因为当您从函数调用中返回时,代码从函数调用后的下一行继续
下一行是打印语句,所以最先打印的是最小的除法结果
使用具有交互式调试器功能的语言可能会极大地帮助您理解,这样您就可以单步执行代码并查看它的工作情况,但如果您没有,请将其视为多级代码缩进:
divide_by_2(64)
print(64)
divide_by_2(64)
divide_by_2(32)
print(32)
print(64)
每次你递归时,你复制粘贴一个分割/打印对到中间的空白行,并且缩进增加以证明调用堆栈变长
divide_by_2(64)
divide_by_2(32)
divide_by_2(16)
print(16)
print(32)
print(64)
divide_by_2(64)
divide_by_2(32)
divide_by_2(16)
divide_by_2(8)
divide_by_2(4)
divide_by_2(2)
divide_by_2(1)
print(1)
print(2)
print(4)
print(8)
print(16)
print(32)
print(64)
您问哪个 print 最先打印,如果您谈论的是您的代码包含两个 print 语句(源代码中最先出现的那个)这一事实,那么这个问题会更简单。
如果你的意思是为什么 39 最后打印,那是因为你的代码在它停止递归之前一直尽可能深入地追索,并且打印在出路时完成。如果您在递归到 divide 函数之前打印,那么数字将从 39 开始并变小
