我正在这里进行第一次递归练习: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个值,即使它确实如何使这个代码机制正常工作?任何帮助将不胜感激。非常感谢。
答案 0 :(得分:5)
每次countup()
自我调用时,它最终会返回到它调用的同一点。然后,下一行将打印n
,因为在该函数调用期间它是 。
每次调用函数时,所有名称都会重新创建,它们是 local 。因此,每次致电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。接下来,函数返回。
答案 1 :(得分:4)
它使用递归来打印数字 理解这一点的最好方法是举个例子:
countup(3)
countup(2)
countup(1)
countup(0)
n == 0
print('Blastoff!')
print (1)
print(2)
print(3)
每次调用该函数时,它都会使用n-1
调用相同的函数,直到n==0
。此时,它开始打印数字,如图所示。
答案 2 :(得分:1)
考虑变体:
def countup(n):
if n == 0:
print('Blastoff!')
else:
print(n, end=', ')
countup(n - 1)
# print(n, end=', ') reverse
打印:
5, 4, 3, 2, 1, Blastoff!
Vs使用递归调用反转打印的顺序:
def countup(n):
if n == 0:
print('Blastoff!')
else:
# print(n, end=', ') reverse
countup(n - 1)
print(n, end=', ')
打印:
Blastoff!
1, 2, 3, 4, 5,
您现在可以看到countup(n - 1)
之前print(n, end=', ')
的递归调用,在遇到任何打印之前,该函数必须一直到if n == 0:
的结束测试。< / p>
一旦满足if n == 0:
的条件,则解开整个调用链,以相反的顺序将参数打印到countup
。
考虑另一个反转字符串的经典递归示例:
def rrev(s):
if s == "":
return s
else:
return rrev(s[1:]) + s[0]
或者,更简洁:
def rrev(s):
return rrev(s[1:]) + s[0] if s else s