伊笑丶 发表于 2020-8-3 14:52:11

请问一下递归是个怎么样的意思

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
为啥一开始的输出是1k不是6嘛?

zltzlt 发表于 2020-8-3 14:54:45

因为是打印 result 不是打印 k 呀

伊笑丶 发表于 2020-8-3 14:57:42

zltzlt 发表于 2020-8-3 14:54
因为是打印 result 不是打印 k 呀

那为啥前面几个输出的是136

sunrise085 发表于 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


zltzlt 发表于 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

伊笑丶 发表于 2020-8-3 15:07:19

zltzlt 发表于 2020-8-3 15:04
分析一下程序执行流程:

result = tri_recursion(6)


对这个我知道了那么有个疑问就是 是return这个函数导致能打印出 1 3 6 是吗? 其实就想问这样递归下去不是应该只有一个21能打印出来吗?

Twilight6 发表于 2020-8-3 15:07:43

伊笑丶 发表于 2020-8-3 14:57
那为啥前面几个输出的是136



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

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

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

      result = k+tri_recursion(k-1)
      # 第一次进入递归 此时 k = 3 因为 k-1 = 2 则 tri_recursion(2) 即 k = 2 传入递归函数中去
      # 第二次进入递归此时 k = 2 因为 k-1 = 1 则 tri_recursion(1) 即 k = 1 传入递归函数中去
      # 第三次进入递归此时 k = 1 因为 k-1 = 0 则 tri_recursion(0) 即 k = 0 传入递归函数中去
      # 即进入递归的顺序是从主函数tri_recursion(3) 开始进入 if 递归
      # 顺序是: tri_recursion(2) --> tri_recursion(1) --> tri_recursion(0)
      print(result)
      
    else:
      # 第三次递归结束递归,result= 0
      result = 0
   
    return result
    # 递归返回顺序是 tri_recursion(0) --> tri_recursion(1) --> tri_recursion(2) --> tri_recursion(3)
    # 所以打印顺序是    不打印,返回0    -->    打印 1+0       -->   打印 1+2   -->   打印 3+3
   

tri_recursion(3)

zltzlt 发表于 2020-8-3 15:08:30

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

函数中 if 分支下有一句 print(result),每次递归都会打印出 result 的值

sunrise085 发表于 2020-8-3 15:10:14

伊笑丶 发表于 2020-8-3 14:57
那为啥前面几个输出的是136

看我在四楼写的执行过程分析。

伊笑丶 发表于 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)不是一直处于没有确定值得状态嘛   怎么还能打印出来???

sunrise085 发表于 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返回的就是确切值了。
页: [1]
查看完整版本: 请问一下递归是个怎么样的意思