网上写递归的文章可以用汗牛充栋来形容了,大多数都非常清晰而又细致的角度上讲解了递归的概念,原理等等。以前学生的时候,递归可以说一直是我的某种死穴,原理,细节我都懂,但是不管是在如何运用或者如何试试算法题上真是有一种“听过好多道理,依然过不好这一生的感觉”。经常感觉信心受挫,力不从心呐。但是到后来如果不要去太纠结这些细节,原理反而豁然开朗,突然我发现我可能是明白了。所以我的这篇瞎扯是想从一个宏观的角度来扯扯递归算法,所以我起了这么个土洋结合的题目,因为全因为的话显得略装b,但是我又实在找不到合适而又简洁的中文来表达“think in”的这个意思。 无论如何,希望看完这篇文章的人不再对递归感到混乱,也许能自己运用递归解决算法问题或者实际问题,最重要的是希望能帮助一些曾经和我有一样困惑的人。

     虽然是嘴上说的是想重点从宏观上写一些如何运用递归,但是内心还是想先扯一下递归的概念的。递归,我虽然没查到他的最开始的出处,但是我感觉应该不是从计算机这里创造出来的,这两个字翻译的也挺传神,传递和归约,但是如何用好这个传递和归约就是过不好这一生的那一部分了。我一直觉得递归的思想颇有点“站在领导层”的感觉,为什么这么说,因为在设计递归算法的时候,你只需要设计出大问题化小问题的递归算法,很多时候都是简单的几个函数就能解决,剩下的具体都交给编译器或者说语言本身来解决。但是正是这种特性,往往导致我们这种底层人民长期的思维习惯在灵活运用上会有点觉得“这尼玛就行啦?”或者"还是有点不放心呐“这种感觉,正是这些感觉往往会导致一种混乱,从而舍本求末,造成在灵活运用上的困难。所以,我一直觉得,在设计递归算法的时候,要有四步,第一先分析最简单的情况,第二,从小问题中总结大问题的规律,第三要写出伪代码,然后再写真的代码。

     我会把递归问题分为三大类:

     第一类,别细想,想多了绝逼能给你整懵圈型。 这类问题的有两个特点,一个是定睛一看,按普通算法想感觉完全一下子不知道从哪里下手,第二个就是当你意识到这肯定得用递归啊,但是往往你会陷入一个怪圈,在你想出递归算法之后,你会自然的去验证。关键是,在你演这个时候或者试着仔细分析这个题目的时候会发现脑子越来越乱,越来越不够使,最终本来想的透彻无比的问题就剩文字本身是清晰的了。这类问题比如想这种:

    “一个有n阶的楼梯,每次可以选择上一阶或者两阶,请问有多少种登顶的方法?” 这个问题是一个烂大街的递归问题,如果你不用递归的思维去想,会觉得这玩意儿应该怎么弄?但是这个问题使用递归的思维大问题化小问题其实很容易就想出解法。先想一阶楼梯,两阶楼梯,三阶楼梯试试,写出伪代码/步骤试试:

延伸阅读

学习是年轻人改变自己的最好方式-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训学习是年轻人改变自己的最好方式