我试图了解调用此递归函数时会发生什么。代码应该是跟踪
def mysum(lower, upper, margin):
blanks = ' ' * margin
print blanks, lower, upper
if lower > upper:
print blanks, 0
return 0
else:
result = lower + mysum(lower + 1, upper, margin + 4)
print blanks, result, lower, margin
return result
if __name__ == "__main__":
mysum(1, 4, 0)
输出读取
1 4
2 4
3 4
4 4
5 4
0
4 4 12
7 3 8
9 2 4
10 1 0
我不明白为什么这个功能在它返回0后开始放松。你能帮我跟进一下发生的事吗
答案 0 :(得分:0)
简而言之,在您达到return
声明之前,您总是会进行递归调用,直到您达到基本情况为止。然后,在到达另一个递归调用之前,总是会得到一个return
语句(因为只有一个递归调用,所以很简单)。
答案 1 :(得分:0)
当函数的一次调用返回0("底部")时,堆栈上可能还有许多其他函数调用,等待继续。当递归触底时,控制返回到堆栈上的最后一个函数。它完成了它的工作并返回,并且控制返回到堆栈上的下一个早期函数。这一过程一直持续到所有对mysum
的调用都已从堆栈中删除,其顺序与它们放入堆栈的顺序相反。
也许你已经理解了所有这些:)如果是这样,请澄清你的意思"为什么功能开始放松。"
答案 2 :(得分:0)
我认为这里有用的观察是在任何嵌套调用返回之前打印前五行。这一切都发生在函数体的第一部分:
print
- 检查条件 - 转到else
- 然后重新开始,更深一层。
当打印0
时,最深的调用会返回,因此计算出第二深result
。然后出现下一行的print
- 它是第一行,其中包含3个数字。然后你点击了另一个return
,因此计算了另一个result
,等等。连续的回报对应于之前的调用 - 因此它们的blanks
更少。
答案 3 :(得分:0)
以下是包含注释的代码,可帮助您开始了解递归函数的工作原理。
def mysum(lower, upper, margin):
blanks = ' ' * margin # First time : margin = 0
# 2nd time : margin = 4
print blanks, lower, upper # first time : lower = 1, upper = 4
# 2nd time : lower = 2, upper = 4
if lower > upper: # first time : go to else (& 2nd time, ... until lower =5)
print blanks, 0
return 0
else:
result = lower + mysum(lower + 1, upper, margin + 4) # result is not directly calulated
# first it need to execute the call to
# the function, it will be the second call
print blanks, result, lower, margin
return result
if __name__ == "__main__":
mysum(1, 4, 0) # First call of your function
当lower为5时,没有调用mysum,它返回0。 所以你只需退一步:较低的是4,你在"其他"部分。你必须完成它
result = lower + mysum(lower + 1, upper, margin + 4)
print blanks, result, lower, margin
return result
,低于= 4,最后一次调用返回0.结果= 4。 然后你展开另一个步骤:lower是3,而之前的调用返回4,所以新结果为7.返回此值。
现在,lower = 3,你做同样的事情,对于lower = 2,lower = 1。
你可以看到1 + 2 + 3 + 4 = 10.这是你的功能的结果。 我希望我能帮助你,告诉我你是否理解,也许我可以找到另一种方式来解释...:/