首先看以下代码 ,一个sum函数,接收一个递加的最大值,判断为1返回1,否则调用自身,传递的参数为当前参数减去1,最后完成求和。
def sum(max_num):
if max_num == 1:
return 1
else:
return max_num + sum(max_num - 1)
print(sum(5))
# 结果 15
开始执行函数 sum(5)
- 第一次循环:传递参数为5,不符合if条件,跳转到else分支,执行了以下代码:
return 5 + sum(5 - 1)
为了求得 sum(5 - 1)的值,进入了递归调用
- 第二次循环:传递参数为4,不符合if条件,跳转到else分支,执行了以下代码:
return 4 + sum(4 - 1)
注意:此时的 4 + sum(4 - 1)
是为了得到第一次循环中 sum(5 - 1)
的值)
- 第三次循环,传递的参数为3,不符合if条件,跳转到else分支,执行了以下代码:
return 3 + sum(3 - 1)
此时的 3 + sum(3 - 1)
是为了得到第二次循环中 4 + sum(4 - 1)
的值)
- 第四次循环,传递的参数为2,不符合if条件,跳转到else分支,执行了以下代码:
return 2 + sum(2 - 1)
此时的 2 + sum(2 - 1)
是为了得到第三次循环中 3 + sum(3 - 1)
的值)
- 第五次循环,传递的参数为1,符合if条件,返回1:
return 1
现在进入关键阶段: 我们需要将递归调用展开的函数,依次计算值。
- 第五次循环中,传递了1,符合if条件,直接返回了1;
- **那么第四次循环中的 2 + sum(2-1)也就有了答案 ,完整的执行语句是 2 + 1 **
- 那么第三次循环中的 3 + sum(3-1)也就有了答案,完整的执行语句是 3 + 3
- 那么第二次循环中的 4 + sum(4-1)也就有了答案,完整的执行语句是 4 + 6
- 那么第一次循环中的 5 + sum(5-1)也就有了答案,完整的执行语句是 5 + 10
最终得到15
以上是我个人理解,如有错误,请在评论区留言。
版权归原作者 lsxboy 所有, 如有侵权,请联系我们删除。