为什么这个递归有效?

时间:2017-05-10 10:33:11

标签: 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!”

3 个答案:

答案 0 :(得分:10)

Go首先打印 ,因为其他print()调用仅在递归调用返回时发生。递归函数调用就像任何其他函数调用一样;一旦调用返回,就会执行下一行。

这就是:

  • count(5)被调用。
    • if num == 0为false,因此else分支
    • count(4)被调用
      • if num == 0为false,因此else分支
      • count(3)被调用
        • if num == 0为false,因此else分支
        • count(2)被调用
          • if num == 0为false,因此else分支
          • count(1)被调用
            • if num == 0为false,因此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不会停止,它仍然需要执行更多代码!

答案 1 :(得分:1)

你传入5,所以调用部分触发count(4)然后触发count(3),依此类推,直到count为0并打印Go。然后循环开始返回控件,并打印其他数字。

如果您已完成count(0),那么它只打印GO!

答案 2 :(得分:1)

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

你把它放在堆栈上,所以不,你在打印时没有完成" Go" ...你回来打印数字。