为什么这个递归有效?

ruc*_*cka -2 python recursion logic integer function

我对此递归感到有点困惑:

def count(num):
    if num == 0:
        print('Go!',end=' ')
    else:
        count(num-1)
        print(num,end=' ')
count(5)
Run Code Online (Sandbox Code Playgroud)

为什么这样做?打印"Go!"后程序不应该停止执行吗?

当我在python可视化工具中运行它时,打印出"Go!" 执行跳转到不应该发生的else语句...

例如,它打印"Go!1 2 3 4 5"但我希望它打印"Go!"

Mar*_*ers 10

Go首先,因为其他print()电话才会发生的递归调用返回.递归函数调用就像任何其他函数调用一样; 一旦调用返回,则执行下一行.

这是发生的事情:

  • count(5) 叫做.
    • if num == 0是假的,所以else分支被采取
    • count(4) 叫做
      • if num == 0是假的,所以else分支被采取
      • count(3) 叫做
        • if num == 0是假的,所以else分支被采取
        • count(2) 叫做
          • if num == 0是假的,所以else分支被采取
          • count(1) 叫做
            • if num == 0是假的,所以else分支被采取
            • count(0) 叫做
              • if num == 0 是真的
              • print('Go!', end=' ') 被执行
                • Go!使用尾随空格写入并且没有新行到stdout
            • 功能结束,返回
          • print(num,end=' ') 被执行
            • 1使用尾随空格写入并且没有新行到stdout
          • 功能结束,返回
        • print(num,end=' ') 被执行
          • 2使用尾随空格写入并且没有新行到stdout
        • 功能结束,返回
      • print(num,end=' ') 被执行
        • 3使用尾随空格写入并且没有新行到stdout
      • 功能结束,返回
    • print(num,end=' ') 被执行
      • 4使用尾随空格写入并且没有新行到stdout
    • 功能结束,返回
  • print(num,end=' ') 被执行
    • 5使用尾随空格写入并且没有新行到stdout
  • 功能结束,返回

对函数的每次递归调用都是一个单独的函数执行,除了每次它们不特殊时执行相同的代码.如果有帮助,请在心理上重命名功能; count5调用count4并等待它返回,但是count4等待count3等等.每个函数都暂停,直到它们调用的函数返回.一旦count0返回,count1不只是停止,它仍然有更多的代码要执行!