鱼C论坛

 找回密码
 立即注册
查看: 1785|回复: 10

[已解决]请问一下递归是个怎么样的意思

[复制链接]
发表于 2020-8-3 14:52:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def tri_recursion(k):
  if(k>0):
    result = k+tri_recursion(k-1)
    print(result)
  else:
    result = 0
  return result

print("\n\nRecursion Example Results")
tri_recursion(6)
为什么结果是这样?
Recursion Example Results
1
3
6
10
15
21
  为啥一开始的输出是1  k不是6嘛?
最佳答案
2020-8-3 15:37:09
伊笑丶 发表于 2020-8-3 15:31
我现在就卡在这一步  返回第六次调用处,result= k+tri_recursion(k-1)=1+0,然后执行print(result),打 ...
这个tri_recursion(k-1)不是一直处于没有确定值得状态嘛

你这句理解是不对的。
第六次递归调用的时候,k=1,进入if语句块,执行result= k+tri_recursion(k-1),遇到递归调用,进行第七次递归,第七次调用的时候 tri_recursion(0),进入else语句块,result=0,return返回的就是确切值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-3 14:54:45 | 显示全部楼层
因为是打印 result 不是打印 k 呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-3 14:57:42 | 显示全部楼层
zltzlt 发表于 2020-8-3 14:54
因为是打印 result 不是打印 k 呀

那为啥前面几个输出的是  1  3  6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 14:58:06 | 显示全部楼层
本帖最后由 sunrise085 于 2020-8-3 15:09 编辑

递归调用,第一次执行print的时候,实际上已经递归多次了,这时候k=1
第一次调用:k=6,满足if条件,进行递归
      第二次调用:k=5,满足if条件,执行result= k+tri_recursion(k-1),进行递归调用
            第三次调用:k=4,满足if条件,执行result= k+tri_recursion(k-1),进行递归调用
                  第四次调用:k=3,满足if条件,执行result= k+tri_recursion(k-1),进行递归调用
                        第五次调用:k=2,满足if条件,执行result= k+tri_recursion(k-1),进行递归调用
                               第六次调用:k=1,满足if条件,执行result= k+tri_recursion(k-1),进行递归调用
                                     第七次调用:k=0,不满足if条件,执行else,然后返回result=0
                               返回第六次调用处,result= k+tri_recursion(k-1)=1+0,然后执行print(result),打印出 1,返回result
                        返回第五次调用处,result= k+tri_recursion(k-1)=2+1,然后执行print(result),打印出 3,返回result
                  返回第四次调用处,result= k+tri_recursion(k-1)=3+3,然后执行print(result),打印出 6,返回result
             返回第三次调用处,result= k+tri_recursion(k-1)=4+6,然后执行print(result),打印出 10,返回result
        返回第二次调用处,result= k+tri_recursion(k-1)=5+10,然后执行print(result),打印出 15,返回result
返回第一次调用处,result= k+tri_recursion(k-1)=6+15,然后执行print(result),打印出 21,返回result


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 15:04:38 | 显示全部楼层
分析一下程序执行流程:

result = tri_recursion(6)
result = 6 + tri_recursion(5)
result = 6 + 5 + tri_recursion(4)
result = 6 + 5 + 4 + tri_recursion(3)
result = 6 + 5 + 4 + 3 + tri_recursion(2)
result = 6 + 5 + 4 + 3 + 2 + tri_recursion(1)
result = 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)
k > 0 条件不满足,退出递归
result = 6 + 5 + 4 + 3 + 2 + 1 + 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-3 15:07:19 | 显示全部楼层
zltzlt 发表于 2020-8-3 15:04
分析一下程序执行流程:

result = tri_recursion(6)

对  这个我知道了  那么有个疑问就是 是return这个函数导致能打印出 1 3 6 是吗? 其实就想问这样递归下去不是应该只有一个21能打印出来吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 15:07:43 | 显示全部楼层
伊笑丶 发表于 2020-8-3 14:57
那为啥前面几个输出的是  1  3  6




6 的递归次数太多了哈,我改成当 k = 3 的时候了,大体上就是这个意思,你看看能不能看懂,按照注释来~:

  1. def tri_recursion(k):
  2.     # 进入函数 k = 3
  3.     # 第一次递归 k = 2
  4.     # 第二次递归 k = 1
  5.     # 第三次递归 k = 0

  6.     if(k>0):
  7.         # 开始时 k = 3 满足条件 执行 if 代码块
  8.         # 第一次递归 k = 2 满足条件 执行 if 代码块
  9.         # 第二次递归 k = 1 满足条件 执行 if 代码块
  10.         # 第三次递归 k = 0 不满足条件 执行 else 代码块

  11.         result = k+tri_recursion(k-1)
  12.         # 第一次进入递归 此时 k = 3 因为 k-1 = 2 则 tri_recursion(2) 即 k = 2 传入递归函数中去
  13.         # 第二次进入递归此时 k = 2 因为 k-1 = 1 则 tri_recursion(1) 即 k = 1 传入递归函数中去
  14.         # 第三次进入递归此时 k = 1 因为 k-1 = 0 则 tri_recursion(0) 即 k = 0 传入递归函数中去
  15.         # 即进入递归的顺序是从主函数tri_recursion(3) 开始进入 if 递归
  16.         # 顺序是: tri_recursion(2) --> tri_recursion(1) --> tri_recursion(0)
  17.         print(result)
  18.         
  19.     else:
  20.         # 第三次递归结束递归,result  = 0
  21.         result = 0
  22.    
  23.     return result
  24.     # 递归返回顺序是 tri_recursion(0) --> tri_recursion(1) --> tri_recursion(2) --> tri_recursion(3)
  25.     # 所以打印顺序是    不打印,返回0    -->    打印 1+0       -->     打印 1+2     -->     打印 3+3
  26.    

  27. tri_recursion(3)

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 15:08:30 | 显示全部楼层
伊笑丶 发表于 2020-8-3 15:07
对  这个我知道了  那么有个疑问就是 是return这个函数导致能打印出 1 3 6 是吗? 其实就想问这样递归下 ...

函数中 if 分支下有一句 print(result),每次递归都会打印出 result 的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 15:10:14 | 显示全部楼层
伊笑丶 发表于 2020-8-3 14:57
那为啥前面几个输出的是  1  3  6

看我在四楼写的执行过程分析。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-3 15:31:47 | 显示全部楼层
sunrise085 发表于 2020-8-3 14:58
递归调用,第一次执行print的时候,实际上已经递归多次了,这时候k=1
第一次调用:k=6,满足if条件,进行 ...

我现在就卡在这一步  返回第六次调用处,result= k+tri_recursion(k-1)=1+0,然后执行print(result),打印出 1,返回result  这一步我没转过弯来  这个tri_recursion(k-1)不是一直处于没有确定值得状态嘛   怎么还能打印出来???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-3 15:37:09 | 显示全部楼层    本楼为最佳答案   
伊笑丶 发表于 2020-8-3 15:31
我现在就卡在这一步  返回第六次调用处,result= k+tri_recursion(k-1)=1+0,然后执行print(result),打 ...
这个tri_recursion(k-1)不是一直处于没有确定值得状态嘛

你这句理解是不对的。
第六次递归调用的时候,k=1,进入if语句块,执行result= k+tri_recursion(k-1),遇到递归调用,进行第七次递归,第七次调用的时候 tri_recursion(0),进入else语句块,result=0,return返回的就是确切值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 15:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表