使用python来详解递归相加(1+2...+n)内部调用全过程。

首先看以下代码 ,一个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. 第五次循环中,传递了1,符合if条件,直接返回了1;
  2. 那么第四次循环中的 2 + sum(2-1)也就有了答案 ,完整的执行语句是 2 + 1
  3. 那么第三次循环中的 3 + sum(3-1)也就有了答案,完整的执行语句是 3 + 3
  4. 那么第二次循环中的 4 + sum(4-1)也就有了答案,完整的执行语句是 4 + 6
  5. 那么第一次循环中的 5 + sum(5-1)也就有了答案,完整的执行语句是 5 + 10

最终得到15

以上是我个人理解,如有错误,请在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值