递归函数帮助/解释

时间:2015-03-29 07:16:27

标签: python function recursion

有人可以解释在大于大于0后返回会发生什么?我无法理解程序如何产生4,7,9,10。我相信在mySum()函数中调用mySum()的迭代返回0。这会将结果设置为1 + 0,等于1.有人可以花一些时间来引导我完成这个过程吗?

def ourSum(lower, upper, margin=0):
    blanks = ' ' * margin
    print(blanks, lower, upper)
    if lower > upper:
        print(blanks, 0)
        return 0
    else:
        results = lower + ourSum(lower + 1, upper, margin + 4)
        print(blanks, results)
        return results

以下ourSum(1,4)的结果:

 1 4
     2 4
         3 4
             4 4
                 5 4
                 0
             4
         7
     9
 10
10

4 个答案:

答案 0 :(得分:2)

以下是发生的事情的粗略说明: 我们暂时忘记printmargin

  • 首先我们ourSum(1,4)
    • else子句发生:它返回1 + ourSum(2,4)
      • 另一个elseourSum(2,4)返回2 + ourSum(3,4)
        • ourSum(3,4)返回3 + ourSum(4,4)
          • ourSum(4,4)返回4+ourSum(5,4)
            • 最后是ifreturn ourSum(5,4)返回0.
          • 所以ourSum(4,4)会返回4+0 = 4
        • 现在ourSum(3,4)3+4 = 7
      • 好的,ourSum(2,4)2+7 = 9
    • ourSum(1,4)返回1+9 = 10

printmargin用于很好地报告这些情况。

答案 1 :(得分:1)

ourSum(1,4):

  • 这个版画' 1 4'
  • 然后检查:1< 4 - >假
  • 所以结果= 1 + ourSum(2,4,4) 这种情况一直持续到低于>鞋面,其发生在5>但是在这一点上我们有4级递归仍然需要返回数值结果:
  • ourSum(1,4,0​​),ourSum(2,4,4),ourSum(3,4,8),ourSum(4,4,12)

首先,由于以下原因,我们的星(5,4,16)返回0

    if lower > upper:
    print(blanks, 0)
    return 0
  • ourSum(5,4,16)返回0,因此前一次递归得到 - >结果= 4(此时较低= 4)+ 0.因此我们使用适当数量的空白'打印4,我们返回结果(= 4)
  • 上一次递归就坐在那里:

    results = 3 + ourSum(4,4,12) 但我们刚刚返回了我们的结果(4,4,12)= 4.

现在:

  • results = 3 + 4 = 7.打印7和空白并返回结果(ourSum(3,4,8)返回7)

继续这样做结果= 2 + ourSum(3,4,8),但这是7所以结果= 9.打印并继续进行剩余的结果= 1 + ourSum(2,4,4)= 10最后,对于我们的第一个问题(1,4),我们返回结果= 10。

答案 2 :(得分:0)

这是因为每个函数调用中的lower都不同,每次都将它添加到ourSum(...)以获得结果。

results = lower + ourSum(lower + 1, upper, margin + 4)

此行在每次函数调用时执行。因此,您的函数基本上计算每个值lower的总和,即1到4之间所有数字的总和。

第五个电话的返回值为0

在第4次调用中,lower的值为4(正如您在函数的输出中所看到的)。因此,第4次通话的返回值为lower + ourSum(...) = 0 + 4 = 4

第三次调用的返回值是lower + ourSum(...) = 3 + 4 = 7。 等等。

答案 3 :(得分:0)

print(blanks, lower, upper)更改为print('A', blanks, lower, upper),您将看到在打印零值之前永远不会返回。

因此,所有上半部分打印都在第一次打印。您还需要记住,这些值都是本地值,所以当您最终返回0时,您将一个值添加到本地较低值3,依此类推。