def tri_recursion(k):
if(k>0):
result = k+tri_recursion(k-1)
print(result)
else:
result = 0
return result
因此,我正在尝试学习递归,但不一定了解它的工作原理。如果说K = 6,为什么输出为1、3、6、10、15、21?
答案 0 :(得分:0)
f(0) = 0
f(1) = 1 + f(0)
f(2) = 2 + f(1)
....
当您尝试评估n> 0的任何f(n)时,必须首先评估f(n-1)。这意味着如果n1
答案 1 :(得分:0)
tri_recursion
函数只是将数字从1汇总到k
。您可以通过归纳法看到这一点:
k = 0
,执行else块并且声明是显而易见的,并且k > 0
,执行if块,它将k
加到tri_recursion(k - 1)
,这是归纳假设得出的1 + ... + (k - 1)
的总和。所以tri_recursion(k) = 1 + 2 + ... + k
。
答案 2 :(得分:0)
我想使用的一种心理工具是问自己以下问题:
对于以下讨论,我将k
限制为整数值。
如果k
<= 0,则结果仅为0。
如果k
= 1,则结果为1 + tri_recursion(1 - 1)
= 1 + tri_recursion(0) = 1
如果k
= 2,则结果为2 + tri_recursion(1)
= 2 + 1 + tri_recursion(0) = 3
。
所以我们看到k
> = 1的一般值的解决方案是
0 +1 + 2 + ... + k
因为每次我们调用tri_recursion(k)
时,我们都会将k
加到1 + 2 + ... + k - 1
的总和中。当k
最终为0时,我们返回0。
尝试绘制一个简单的k
= 2的呼叫链
k = 2
\
2 + tri_recursion(1)
\
1 + tri_recursion(0)
\
0
变成
k = 2
\
2 + tri_recursion(1)
\
1 + 0 # Prints 1 at this point
然后
k = 2
\
2 + 1 # Prints 3 at this point
最终得到3。
由于在tri_recursion
> 0的情况下每次k
返回时都要进行打印,因此会看到输出1、3(= 2 +1),6(= 3 + 2 +1)。 ..按顺序排序,因为调用堆栈的展开方式。