请问一下递归是个怎么样的意思
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嘛? 因为是打印 result 不是打印 k 呀 zltzlt 发表于 2020-8-3 14:54
因为是打印 result 不是打印 k 呀
那为啥前面几个输出的是136 本帖最后由 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
分析一下程序执行流程:
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 zltzlt 发表于 2020-8-3 15:04
分析一下程序执行流程:
result = tri_recursion(6)
对这个我知道了那么有个疑问就是 是return这个函数导致能打印出 1 3 6 是吗? 其实就想问这样递归下去不是应该只有一个21能打印出来吗? 伊笑丶 发表于 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)
伊笑丶 发表于 2020-8-3 15:07
对这个我知道了那么有个疑问就是 是return这个函数导致能打印出 1 3 6 是吗? 其实就想问这样递归下 ...
函数中 if 分支下有一句 print(result),每次递归都会打印出 result 的值 伊笑丶 发表于 2020-8-3 14:57
那为啥前面几个输出的是136
看我在四楼写的执行过程分析。 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)不是一直处于没有确定值得状态嘛 怎么还能打印出来??? 伊笑丶 发表于 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]