一、什么是递归
递归算法,就是直接或间接调用自身的函数,也就是把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。
上面解释可能有点太官方了,来看看知乎上大神的通俗易懂的解释:
解释一:
“古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。”
这是一个调用自身的过程,我们把”明德于天下“当作函数本身来理解,每一层调用的参数依次是治国、齐家、修身、正心、诚意、致知、格物。最后在”格物“触发返回条件。
解释二:
天下有奇族人姓计,长生不老。一日其孙问其父:吾之18代祖名何?
其父不明,父问其父
其父不明,父问其父
其父不明,父问其父
其父不明,父问其父
…
晌后,其18代祖回其子:你猜
然其回其子:你猜
然其回其子:你猜
然其回其子:你猜
然其回其子:你猜
……
终,计姓末代孙知其18代祖名“你猜”
解释三:
假设你在一个电影院,你想知道自己坐在哪一排,但是前面人很多,你懒得去数了,于是你问前一排的人「你坐在哪一排?」,这样前面的人 (代号 A) 回答你以后,你就知道自己在哪一排了——只要把 A 的答案加一,就是自己所在的排了。不料 A 比你还懒,他也不想数,于是他也问他前面的人 B「你坐在哪一排?」,这样 A 可以用和你一模一样的步骤知道自己所在的排。然后 B 也如法炮制。直到他们这一串人问到了最前面的一排,第一排的人告诉问问题的人「我在第一排」。最后大家就都知道自己在哪一排了。
二、递归特点
递归算法解决问题的特点:
- 递归就是方法里调用自身。
- 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
- 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
- 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
递归一般过程:
![](http://i.imgur.com/jPVMzPE.jpg)
循环、迭代、遍历和递归的区别:
- 循环(loop),指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
循环则技能对应集合,列表,数组等,也能对执行代码进行操作。 - 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。
迭代只能对应集合,列表,数组等。不能对执行代码进行迭代。 - 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。
遍历同迭代一样,也不能对执行代码进行遍历。 - 递归(recursion),指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列
三、递归例子
1、N的阶乘
递归版:
int factorial(int index)
{
return index==