我在这里做第一个递归练习:http://cscircles.cemc.uwaterloo.ca/16-recursion/
我按照明显的暗示做了这个:
def countup(n):
if n == 0:
print('Blastoff!')
else:
countup(n - 1)
print(n)
所以代码基本上是从0开始计数到n。我只是不明白它是如何工作的-我在可视化程序中查看了一下,它经历了从countup(n)到countup(0)的过程,此时它打印出的是“blastoff”,这一切都很好。在这之后,它有点…停留在else循环中并开始打印之前的n个值..它为什么要这样做。它是否因为某种原因存储了n个值?即使是这样,这个代码机制是如何准确工作的?任何帮助都将不胜感激。非常感谢。在
每次
countup()
调用自身时,它最终将返回到它调用的同一点。下一行将打印n
,就像在函数调用期间一样。在每次调用一个函数时,它的所有名称都会重新创建,它们是局部。因此,每次调用
countup()
时,n
都有一个独立的本地值。在实际上,您创建了一个
countup()
调用链:countup(2)
:n
是2
,不是0
,所以执行else
分支,调用countup(1)
countup(1)
:n
是1
,不是0
,所以执行else
分支,调用countup(0)
countup(0)
:n
是0
,打印Blastoff!!
,函数返回countup(0)
调用返回,下一行打印n
,在此调用中仍然是1。接下来,函数返回。countup(1)
调用返回,下一行打印n
,在这个调用中仍然是2。接下来,函数返回。它使用递归来打印数字。
最好的理解方法是举个例子:
每次调用函数时,它都用
n-1
调用同一个函数,直到n==0
。此时,它开始打印如图所示的数字。在考虑一下变体:
印刷品:
^{pr2}$Vs使用递归调用反转打印顺序:
印刷品:
您现在可以看到,在
print(n, end=', ')
之前有一个countup(n - 1)
的递归调用,在遇到任何打印之前,该函数必须一直到if n == 0:
的结束测试。在一旦满足了
if n == 0:
的条件,整个调用链就会展开,并以相反的顺序将参数打印到countup
。在请考虑另一个经典的递归示例来反转字符串:
或者,更简洁地说:
相关问题 更多 >
编程相关推荐