迭代和递归
作者:互联网
一.递归
所谓“递归”,就是“递”+“归”,“递”就是层层递进,“归”则是归纳结果
可见,这是一个进出的关系,递进去,归出来。既然要归出来,肯定需要有个结束条件,要不了就一直归下去不出来了。
程序调用自身的编程技巧称为递归( recursion)。递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。
在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
递归跟循环的区别
单看上面wiki的定义,貌似跟通常所说的无限死循环很像,他们的区别在哪?
递归是静中有动,有去有回。
循环是动静如一,有去无回。
举个例子,给你一把钥匙,你站在门前面,问你用这把钥匙能打开几扇门。
递归:
1.你打开面前这扇门,看到屋里面还有一扇门(这门可能跟前面打开的门一样大小(静),也可能门小了些(动))
2.你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开,。。。
3.若干次之后,你打开面前一扇门,发现只有一间屋子,没有门了。
4.你开始原路返回,每走回一间屋子,你数一次,走到入口的时候,你可以回答出你到底用这钥匙开了几扇门。
循环:
1.你打开面前这扇门,看到屋里面还有一扇门,(这门可能跟前面打开的门一样大小(静),也可能门小了些(动))
2.你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,(前面门如果一样,这门也是一样,第二扇门如果相比第一扇门变小了
3.这扇门也比第二扇门变小了(动静如一,要么没有变化,要么同样的变化)),你继续打开这扇门,。。。,一直这样走下去。
4.入口处的人始终等不到你回去告诉他答案。
递归思想
递归就是有去(递去)有回(归来)
具体来说,为什么可以”有去“?
这要求递归的问题需要是可以用同样的解题思路来回答类似但略有不同的问题(上面例子中的那一把钥匙可以开后面门上的锁)。
为什么可以”有回“?
这要求这些问题不断从大到小,从近及远的过程中,会有一个终点,一个临界点,一个baseline,一个你到了那个点就不用再往更小,更远的地方走下去的点,然后从那个点开始,原路返回到原点。
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
什么时候需要用递归?
当有些问题的定义本身就是递归形式的时候,最是适合用递归来解决。
计算机专业的同学最最熟悉的莫过于”树“的定义了[4,5]。还有一些定义,比如阶乘,Fibonacci数列[6],等等。
用递归来解决这些问题,往往几行代码就搞定了一些看起来相当”吓人“的问题。 当然,递归的性能问题是另一回事,栈的分配,函数调用代价都是在具体工程实践中要考虑的。 但现在只是讨论递归思想的话,不妨先放下那些,欣赏下递归的美。
二.迭代
迭--反复,轮流 代--代换,代替意思就是就是不停的代换的意思,迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。
每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
对计算机特定程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。常见有:循环语句(如for,foreach)、java中的Iterator(迭代器)
标签:迭代,递归,钥匙,打开,一扇门,扇门 来源: https://www.cnblogs.com/rxysg/p/15667977.html