繁体   English   中英

递归函数帮助/解释

[英]recursive function help/explanation

有人可以解释在大于大于0并且返回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

以下是对正在发生的事情的粗略说明:让我们暂时忘记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)
            • 最后是if return 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用于很好地报告这些情况。

ourSum(1,4):

  • 这打印'1 4'
  • 然后检查:1 <4 - > False
  • 所以结果= 1 + ourSum(2,4,4)这种情况一直发生,直到低于上限,发生在5> 4.但此时我们有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,所以前一个递归得到 - > results = 4(此时低于4 = +)所以我们用适当数量的'空白'打印4,然后我们返回结果(= 4)
  • 之前的递归就坐在那里:

    结果= 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最后,对于我们最初的theSum(1,4)问题,我们返回结果= 10。

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

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

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

第5次调用的返回值为0

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

然后第三个调用的返回值lower + ourSum(...) = 3 + 4 = 7.依此类推。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM