Python 递归函数帮助/解释
有人能解释一下lower大于upper并返回0后会发生什么吗?我不知道这个程序是如何产生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
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)
- 最后是
<代码>返回我们的总和(5,4)返回0if
- 最后是
- 因此
返回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)
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递归教程。