[英]understanding recursive function python
我试图了解调用此递归函数时会发生什么。 该代码应该是跟踪
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后就开始展开。您能帮我跟踪发生的情况吗
简而言之,您总是在到达return
语句之前进行递归调用,直到达到基本情况为止。 然后,您总是会在到达另一个递归调用之前就到达return
语句(这很简单,因为只有一个递归调用)。
当该函数的一次调用返回0(“自下而上”)时,堆栈上可能还有许多其他对该函数的调用,等待继续。 当递归达到最低点时,控制权将返回到堆栈上的最后一个函数。 它完成工作并返回,然后控制返回到堆栈上的下一个较早的函数。 这将继续进行,直到所有对mysum
的调用都从堆栈中删除为止(与将它们放在堆栈中的顺序相反)。
也许您已经了解了所有内容:)如果是这样,请说明“为什么函数开始展开”的含义。
我认为这里有用的观察是,在任何嵌套调用返回之前先打印前五行。 这一切都发生在函数主体的第一部分:
print
-检查条件-转到else
-并从头再下一层。
打印0
,将返回最深的调用,因此将计算出第二个最深的result
。 然后从下一行开始print
-这是第一行,其中有3个数字。 然后,您点击另一个return
,从而计算出另一个result
,依此类推。连续收益对应于较早的调用-因此它们的blanks
更少。
这是带有注释的代码,可帮助您开始理解递归函数的工作方式。
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。因此,您只需要展开一个步骤:lower为4时,您将位于“ else”部分。 你必须完成它
result = lower + mysum(lower + 1, upper, margin + 4)
print blanks, result, lower, margin
return result
与lower = 4,最后一次调用返回0。结果=4。然后展开另一步骤:lower在3处,而调用恰好在返回4之前,因此新结果为7。返回此值。
现在,lower = 3,对lower = 2,lower = 1,您也可以这样做。
您会看到1 + 2 + 3 + 4 =10。这是函数的结果。 我希望我能帮助您,告诉我您是否不理解,也许我能找到另一种方式来解释...:/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.