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)。
为false,则执行如果num==0
分支else
- 调用计数(4)
为false,则执行如果num==0
分支else
- 调用计数(3)
为false,则执行如果num==0
分支else
- 调用计数(2)
为false,则执行如果num==0
分支else
- 调用计数(1)
为false,则执行如果num==0
分支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语句。我现在知道执行是放在堆栈上的,所以在递归完成后它仍然必须返回。