我对这种递归感到有点困惑:
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!”
答案 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" ...你回来打印数字。