Python 递归函数帮助/解释

Python 递归函数帮助/解释,python,function,recursion,Python,Function,Recursion,有人能解释一下lower大于upper并返回0后会发生什么吗?我不知道这个程序是如何产生4,7,9,10的。我相信0是从调用ourSum()函数中的ourSum()的迭代中返回的。这会将结果设置为1+0,等于1。有人能抽出点时间陪我看一下吗 def ourSum(lower, upper, margin=0): blanks = ' ' * margin print(blanks, lower, upper) if lower > upper: pr

有人能解释一下lower大于upper并返回0后会发生什么吗?我不知道这个程序是如何产生
4,7,9,10
的。我相信0是从调用ourSum()函数中的ourSum()的迭代中返回的。这会将结果设置为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

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

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

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

第五次调用的返回值为
0

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

第三次调用的返回值为
lower+ourSum(…)
=
3+4
=7。
以此类推。

这里是一个发生了什么的粗略说明: 现在让我们忘掉
print
margin

  • 首先我们有
    ourSum(1,4)
    • else
      子句发生:它返回
      1+ourSum(2,4)
      • 另一个
        else
        ourSum(2,4)
        返回
        2+ourSum(3,4)
        • ourSum(3,4)
          返回
          3+ourSum(4,4)
          • ourSum(4,4)
            返回
            4+ourSum(5,4)
            • 最后是
              if
              <代码>返回我们的总和(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
print
margin
用于很好地报告这些情况。

print(空格,下,上)
更改为
print('A',空格,下,上)
,直到打印完零值,您才会返回

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

ourSum(1,4):

  • 这印的是“14”
  • 然后检查:1<4->False
  • 所以结果=1+ourSum(2,4,4) 这种情况一直持续到lower>upper,发生在5>4。但此时我们有4个递归级别,仍然需要返回数值结果:
  • 我们的总数(1,4,0),我们的总数(2,4,4),我们的总数(3,4,8),我们的总数(4,4,12)
因此,第一个ourSum(5,4,16)返回0,原因是:

    if lower > upper:
    print(blanks, 0)
    return 0
  • ourSum(5,4,16)返回0,因此上一个递归得到-->结果=4(此时较低的值为=4)+0。因此,我们用适当数量的“空白”打印4,然后返回结果(其中=4)
  • 上一个递归就在这里:

    结果=3+我们的总和(4,4,12) 但是我们只是返回了我们的sum(4,4,12)的结果,即=4

所以现在:

  • 结果=3+4=7。打印7、空格和返回结果(我们的总和(3、4、8)返回7)

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

尝试将
Print(blanks,results)
更改为
Print(blanks,lower,ourSum\u result,results)
当你说
“前面的递归是带着“
”的时候,这是一个ourSum()等待当前函数返回
结果的队列吗?我想这正是让我困惑的地方……python将每个函数调用(每个ourSum(a、b、c))推到堆栈上。因此,堆栈的底部(就我们所感兴趣的而言)将保存ourSum(1,4,0),然后是ourSum(2,4,4),依此类推。这是一个很棒的python递归教程。