Python 为什么这个递归有效?

Python 为什么这个递归有效?,python,function,recursion,integer,logic,Python,Function,Recursion,Integer,Logic,我对这种递归有点困惑: def count(num): if num == 0: print('Go!',end=' ') else: count(num-1) print(num,end=' ') count(5) 为什么这样做有效?打印“Go!”后程序不应该停止执行吗 当我在python可视化工具中运行它时,在打印“Go!”时,执行跳转到不应该发生的else语句 例如,它打印“Go!1 2 3 4 5”,但我希望它先打印“Go

我对这种递归有点困惑:

def count(num):
    if num == 0:
        print('Go!',end=' ')
    else:
        count(num-1)
        print(num,end=' ')
count(5)
为什么这样做有效?打印“Go!”后程序不应该停止执行吗

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


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

Go
,因为其他
print()
调用只在递归调用返回时发生。递归函数调用类似于任何其他函数调用;一旦调用返回,将执行下一行

情况就是这样:

  • 调用计数(5)。
    • 如果num==0
      为false,则执行
      else
      分支
    • 调用计数(4)
      • 如果num==0
        为false,则执行
        else
        分支
      • 调用计数(3)
        • 如果num==0
          为false,则执行
          else
          分支
        • 调用计数(2)
          • 如果num==0
            为false,则执行
            else
            分支
          • 调用计数(1)
            • 如果num==0
              为false,则执行
              else
              分支
            • 调用计数(0)
              • 如果num==0
                为真
              • 执行打印('Go!',end='')
                • Go尾随空格,不换行到标准输出
            • 函数结束,返回
          • 执行打印(num,end='')
            • 使用尾随空格写入
              1
              ,并且不向标准输出换行
          • 函数结束,返回
        • 执行打印(num,end='')
          • 使用尾随空格写入
            2
            ,并且不向标准输出换行
        • 函数结束,返回
      • 执行打印(num,end='')
        • 使用尾随空格写入
          3
          ,并且不向标准输出换行
      • 函数结束,返回
    • 执行打印(num,end='')
      • 使用尾随空格写入
        4
        ,并且不向标准输出换行
    • 函数结束,返回
  • 执行打印(num,end='')
    • 使用尾随空格写入
      5
      ,并且不向标准输出换行
  • 函数结束,返回

对函数的每个递归调用都是一个单独的函数执行,不同的是每次调用不特殊时都会执行相同的代码。如果有帮助,在心里重新命名函数
count5
调用
count4
并等待其返回,但
count4
等待
count3
等。这些函数中的每一个都会暂停,直到它们调用的函数返回。一旦
count0
返回,
count1
不仅停止,它还有更多的代码要执行

您传入5,则调用else部分,该部分触发计数(4),然后触发计数(3),依此类推,直到计数为0并打印出“Go”。然后,循环开始返回控件,并打印其他数字


如果你做了
count(0)
,那么它就会打印出
GO

在else块中,首先调用计数(num-1),然后继续打印数字


你把它放在一个堆栈上,所以不,当你打印“Go”时你还没有完成。。。你回来打印号码。

我想你误解了。我的问题不是“走!”先打印,但为什么其他数字都要打印?程序不应该只打印“开始”吗那就完了?@ruckarucka你为什么认为它应该只打印“开始!”没有别的了吗?你认为这应该如何工作?@ruckarucka,当
num
大于0时,它调用
else
中的函数。但是在返回后,它必须执行下一行中的
打印(num,end='')
。如果打印后<代码>继续如果您退出代码,那么这就是您想要的want@kuro啊,好吧,这是有道理的。我没有意识到return语句必须在递归之后执行。谢谢。@ruckarucka:递归调用仍然返回给调用方,而且该函数并没有结束。它继续执行函数中的下一行。为什么这个递归不起作用?调用count函数后,执行是否会跳回到开始,永远不会到达它下面的print语句?不,递归不是这样工作的。@ruckarucka它可能会帮助您键入代码并将其可视化it@jambrothers谢谢但这实际上是造成我困惑的原因。我不明白为什么执行回到else语句。我现在知道执行是放在堆栈上的,所以在递归完成后它仍然必须返回。