我是python(编程)的新手,我发现the below recursive program很难遵循。在调试程序时,我发现它会经过递归,并且每次递归时k
的值都会递减-1。 k
在某一点为-1,编译器移至else
部分并返回0。
最后k
的值为1,这是怎么发生的?
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)
输出:
递归示例结果
1
3
6
10
15
21
答案 0 :(得分:1)
尝试用铅笔和纸描the功能。在这种情况下,该函数的打印语句可能会产生误导。
考虑程序的这一部分,
if(k>0):
result = k+tri_recursion(k-1)
...
从这里
tri_recursion(6) = 6 + tri_recursion(5)
因此,要得到tri_recursion(6)
的结果,我们必须得到tri_recursion(5)
的结果,按照这种逻辑,问题可以简化为:
tri_recursion(6)
= 6 + tri_recursion(5)
= 6 + 5 + tri_recursion(4)
= 6 + 5 + 4 + tri_recursion(3)
= 6 + 5 + 4 + 3 + tri_recursion(2)
= 6 + 5 + 4 + 3 + 2 + tri_recursion(1)
= 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)
现在请注意0不大于0,因此程序移至else子句的正文:
else:
result = 0
...
这意味着tri_recursion(0) = 0
。因此:
tri_recursion(6)
= 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)
= 6 + 5 + 4 + 3 + 2 + 1 + 0
= 21
k
从不等于-1
,实际上是不可能的。答案 1 :(得分:0)
如果您调试这样的代码
def tri_recursion(k):
if(k > 0):
print('\t'*k,'start loop k',k)
holder = tri_recursion(k - 1)
result = k + holder
print('\t'*k,'i am k(', k,')+previous result(', holder,')=',result)
else:
result = 0
print('i reached when k =', k)
print('\t'*k,'end loop', k)
return result
print("\n\nRecursion Example Results")
tri_recursion(6)
您将看到类似的输出
Recursion Example Results
start loop k 6
start loop k 5
start loop k 4
start loop k 3
start loop k 2
start loop k 1
i reached when k = 0
end loop 0
i am k( 1 )+previous result( 0 )= 1
end loop 1
i am k( 2 )+previous result( 1 )= 3
end loop 2
i am k( 3 )+previous result( 3 )= 6
end loop 3
i am k( 4 )+previous result( 6 )= 10
end loop 4
i am k( 5 )+previous result( 10 )= 15
end loop 5
i am k( 6 )+previous result( 15 )= 21
end loop 6
21