如何有效地理解程序中的递归

写在前面

最近在重新学习《算法导论》这本书,在看到介绍递归的时候,想起了当时学习算法时的痛苦,递归是一种让人有爱与恨的算法理念,之所以爱是因为其的使用思路很清晰且算法复杂度等接近最优,恨就是因为它的思想太过于抽象了。。。

虽然现在对递归的理解仍然算不上透彻,但是也能算运用自如了,相信大家看完本篇博客后,学习我的“另类”方法,一定会豁然开朗(可能有些观点并不正确,但是有时候错误的观点反而能够让理解变得轻松,大家知道这些观点是错误的就行。)

对递归算法的基本理解

所谓递归,就是包含递推和回归两个自然过程,一方面要由外到里地深入,一方面又要由里到外地回到原点,这是我的基本看法,递推过程是决定整个算法的逐步计算过程,而回归就是将每一步计算的结果慢慢地进行总结,最后就能够得到我们想要的结果,说起来也还是比较抽象的,等看完下面的观点再回来看这一段基本理解就ok的。

实践是检验真理的唯一标准

我先上一个最经典的递归例子—求n的阶乘(java版):

public int get(int n){
    if(n<1){
    return 1;}
return n*get(n-1);
}

所谓麻雀虽小,五脏俱全,上述的递归算法虽然简单,但是具备了递归的所有元素,任何复杂的算法都是由简单的算法构成的,递归也不例外,递归的元素总共有三类:

  1. 初始值
  2. 结束条件
  3. 算法

首先不难看出:初始值就是传入的参数n,它决定了你递归算法的输入值和最终结果;结束条件就是if语句中的判断,它决定递归算法的结束条件和下限;算法就是计算方法,也就是n*get(n-1)这部分,它的数学模型其实就是!n=n*(n-1)(n-2)(n-3)……*1(学好数学很重要。。。),它决定的就是具体的计算过程,也间接地决定这最终的结果。

在使用递归算法的时候,可以把整个递归函数想象成一个黑盒子,这个黑盒子的功能就是“求传入值的阶乘”,而阶乘的求法无非就是n乘上(n-1)的阶乘,以此类推。也就是说:一个黑盒子=黑盒子的值*比值小1的黑盒子的值。

后记

我看网上很多博客都是一大篇理论啊,然后分析啊之类的,我觉得没这么复杂。。毕竟程序语言就是一种工具而已,会用就行了,在运用之中遇到了问题或者运用不熟练的情况再去学习原理就ok啦。由于时间有限,暂时就写这么多,有空再来补上递归算法的内存模型,加深对递归的理解。

你可能感兴趣的:(算法)