举个例子:我想求1+2+3+4+..+100的值。
迭代的做法:从1到100,顺着往下累加。1+2=3,3+3=6,6+4=10,10+5=15……
程序表示,
int i=1,sum=0;
while(i<=100){
sum = sum +i;
}
递归的做法:我要求1到100的累加值,如果我已经得到1到99的累加值,将这个值加上100就是1到100的累加值;要得到1到99的累加值,如果已经得到1到98的累加值,将这个值加上99,就是1到99的累加值……最后我要得到1到2的累加值,我如果得到1自身累加值,再加上2即可,1自身的累加值显然就是1了。于是现在我们得到了1到2的累加值,将这个值加3就得到了1到3的累加值,……最后直到得到1到100的累加值。
程序表示,其中函数会调用自身,这就是递归方法的典型特征
int GetSum(int n)
{
if(n<=0) return 0;
else return n+GetSum(n-1);
}
上述例子中,其实递归最后得到结果也是用迭代方法完成的,只是在程序的处理上直观看不出来。两者都能很好的完成计算任务,不同之处在于思维方式上,从而导致不同的计算方法:迭代是正向思维,从头到尾思考问题;递归是逆向思维,他假设我们已经得到了部分结果(假设我已经知道了1到99的累加值,把这个值加上100我们就得到了1到100的累加值了),从尾部追溯到头部,从而让问题简化(当然这个例子中看不出来,这里只是方便理解,有兴趣可以参考一下http://baike.baidu.com/view/568949.htm 斐波那契数列 的构造方法)。
通常递归结构的算法,比如快速排序,以及一些比树更复杂的数据结构,应用递归实现自然,代码清晰!效率也不是问题!用迭代实现,反而显得代码拖沓,难以看懂,效率未必比递归高!
而一些像数列,阶乘,斐波那契数列,等数学问题,用迭代结构清晰,算法高效,递归反而难以看懂,效率也不高!这一类问题,最好用迭代。
从实质上说,都只是一种重复运算而已.
迭代用明显的循环表示,
对一些简单的递推关系,代码清晰易懂而且高效!
而有些问题,具有明显的树形结构,或者比树结构更复杂,有很明确的层次关系,是一种层层推进的关系!
使用递归,程序简练,比较容易以实现!
递归用函数反复直接间接调用自身的方法实现!
重复表现在自己调用自己上!
迭代的条件好控制,设计简单,让人有一种尽在掌握的感觉,
所以大家会觉得迭代比较简单!
递归是由调用结构自动实现的,有时可能想不明白,递归的程序流程!
可能初学时入手比较困难!
递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。
递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。
递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。
使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。迭代和递归过程都可以无限进行:如果循环条件测试永远不变成false,则迭代发生无限循环;如果递归永远无法回推到基本情况,则发生无穷递归。
递归函数是通过调用函数自身来完成任务,而且在每次调用自身时减少任务量。而迭代是循环的一种形式,这种循环不是由用户输入而控制,每次迭代步骤都必须将剩余的任务减少;也就是说,循环的每一步都必须执行一个有限的过程,并留下较少的步骤。