有人可以解释一下使用递归的代码吗?

时间:2018-10-16 04:33:59

标签: python recursion

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?

3 个答案:

答案 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。您可以通过归纳法看到这一点:

  1. 对于k = 0,执行else块并且声明是显而易见的,并且
  2. 对于k > 0,执行if块,它将k加到tri_recursion(k - 1),这是归纳假设得出的1 + ... + (k - 1)的总和。

所以tri_recursion(k) = 1 + 2 + ... + k

答案 2 :(得分:0)

我想使用的一种心理工具是问自己以下问题:

  1. 平凡的情况是什么(在本例中是基本情况)
  2. 最简单的平凡案例是什么
  3. 第二个最简单的平凡案例是什么

对于以下讨论,我将k限制为整数值。

最简单的情况(k <= 0)

如果k <= 0,则结​​果仅为0。

最简单的情况(k = 1)

如果k = 1,则结果为1 + tri_recursion(1 - 1) = 1 + tri_recursion(0) = 1

第二种最简单的非平凡案例(k = 2)

如果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)。 ..按顺序排序,因为调用堆栈的展开方式。