理解递归函数python

时间:2016-09-09 20:38:12

标签: python recursion

我试图了解调用此递归函数时会发生什么。代码应该是跟踪

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后开始放松。你能帮我跟进一下发生的事吗

4 个答案:

答案 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.这是你的功能的结果。 我希望我能帮助你,告诉我你是否理解,也许我可以找到另一种方式来解释...:/