Skip to main content
 首页 » 编程设计

python之理解递归流

2025年05月04日21EasonJim

发现我很难全神贯注于递归,非常感谢一些见解。 我试图通过连续将数字除以 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 开始并变小